On Mon, May 9, 2016 at 2:32 AM Richard Biener <rguent...@suse.de> wrote:
>
>
> I am testing the following followup to my BIT_FIELD_REF simplification
> changes which resolve issues when applying to memory BIT_FIELD_REFs.
>
> Bootstrap and regtest running on x86_64-unknown-linux-gnu.

My question is not directly related to this patch but is partly related.
While I was working on lowering bit-field access patch, I ran into a
problem where I am building the lhs, I use fold_build3 to build the
BIT_FIELD_REF and we get a convert expression from it.
Should we be using a fold_build3 for the BIT_FIELD_REF that will be
used on the lhs or should we just disable this optimization for non
GIMPLE?
The testcases where I ran into the issue are the ones which I added
back in October; gcc.c-torture/compile/20191015-1.c and
gcc.c-torture/compile/20191015-2.c.  I added them so when I submit the
patch for lowering for GCC 11, we don't regress (there was no testcase
beforehand).

Thanks,
Andrew Pinski

>
> Richard.
>
> 2016-05-09  Richard Biener  <rguent...@suse.de>
>
>         PR tree-optimization/70985
>         * match.pd (BIT_FIELD_REF -> (type)): Disable on GIMPLE when
>         op0 isn't a gimple register.
>
>         * gcc.dg/torture/pr70985.c: New testcase.
>
> Index: gcc/match.pd
> ===================================================================
> *** gcc/match.pd        (revision 236021)
> --- gcc/match.pd        (working copy)
> *************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> *** 3244,3249 ****
> --- 3244,3251 ----
>        (view_convert (imagpart @0)))))
>     (if (INTEGRAL_TYPE_P (TREE_TYPE (@0))
>          && INTEGRAL_TYPE_P (type)
> +        /* On GIMPLE this should only apply to register arguments.  */
> +        && (! GIMPLE || is_gimple_reg (@0))
>          /* A bit-field-ref that referenced the full argument can be 
> stripped.  */
>          && ((compare_tree_int (@1, TYPE_PRECISION (TREE_TYPE (@0))) == 0
>             && integer_zerop (@2))
> Index: gcc/testsuite/gcc.dg/torture/pr70985.c
> ===================================================================
> *** gcc/testsuite/gcc.dg/torture/pr70985.c      (revision 0)
> --- gcc/testsuite/gcc.dg/torture/pr70985.c      (working copy)
> ***************
> *** 0 ****
> --- 1,28 ----
> + /* { dg-do compile } */
> + /* { dg-require-effective-target int32plus } */
> +
> + struct
> + {
> +   int f0:24;
> + } a, c, d;
> +
> + int b;
> +
> + int
> + fn1 ()
> + {
> +   return 0;
> + }
> +
> + void
> + fn2 ()
> + {
> +   int e;
> +   if (b)
> +     for (; e;)
> +       {
> +       d = c;
> +       if (fn1 (b))
> +         b = a.f0;
> +       }
> + }

Reply via email to