On Thu, May 23, 2013 at 4:29 PM, Richard Biener <rguent...@suse.de> wrote:
>
> This is another case of ADDR_EXPRs not comparing equal from
> operand_equal_p if they contain volatile field references.
> The issue is that we should compare the FIELD_DECLs with
> retaining OEP_CONSTANT_ADDRESS_OF (or maybe not set TREE_SIDE_EFFECTS
> on them - but that's a bigger change).
>
> Bootstrap / regtest pending on x86_64-unknown-linux-gnu.
>
> Richard.
>
> 2013-05-23  Richard Biener  <rguent...@suse.de>
>
>         PR middle-end/57380
Typo?

>         * fold-const.c (operand_equal_p): Compare FIELD_DECLs with
>         OEP_CONSTANT_ADDRESS_OF retained.
>
>         * gcc.dg/torture/pr57381.c: New testcase.
>
> Index: gcc/fold-const.c
> ===================================================================
> *** gcc/fold-const.c    (revision 199199)
> --- gcc/fold-const.c    (working copy)
> *************** operand_equal_p (const_tree arg0, const_
> *** 2664,2673 ****
>         case COMPONENT_REF:
>           /* Handle operand 2 the same as for ARRAY_REF.  Operand 0
>              may be NULL when we're called to compare MEM_EXPRs.  */
> !         if (!OP_SAME_WITH_NULL (0))
>             return 0;
>           flags &= ~OEP_CONSTANT_ADDRESS_OF;
> !         return OP_SAME (1) && OP_SAME_WITH_NULL (2);
>
>         case BIT_FIELD_REF:
>           if (!OP_SAME (0))
> --- 2664,2673 ----
>         case COMPONENT_REF:
>           /* Handle operand 2 the same as for ARRAY_REF.  Operand 0
>              may be NULL when we're called to compare MEM_EXPRs.  */
> !         if (!OP_SAME_WITH_NULL (0) || !OP_SAME (1))
>             return 0;
>           flags &= ~OEP_CONSTANT_ADDRESS_OF;
> !         return OP_SAME_WITH_NULL (2);
>
>         case BIT_FIELD_REF:
>           if (!OP_SAME (0))
> Index: gcc/testsuite/gcc.dg/torture/pr57381.c
> ===================================================================
> *** gcc/testsuite/gcc.dg/torture/pr57381.c      (revision 0)
> --- gcc/testsuite/gcc.dg/torture/pr57381.c      (working copy)
> ***************
> *** 0 ****
> --- 1,24 ----
> + /* { dg-do compile } */
> +
> + struct S0 { int  f0, f1, f2; };
> +
> + struct S1 {
> +     int  f0;
> +     volatile struct S0 f2;
> + };
> +
> + static struct S1 s = {0x47BED265,{0x06D4EB3E,5,0U}};
> +
> + int foo(struct S0 p)
> + {
> +   for (s.f2.f2 = 0; (s.f2.f2 <= 12); s.f2.f2++)
> +     {
> +       volatile int *l_61[5][2][2] = 
> {{{&s.f2.f0,&s.f2.f0},{&s.f2.f0,&s.f2.f0}},{{&s.f2.f0,&s.f2.f0},{&s.f2.f0,&s.f2.f0}},{{&s.f2.f0,(void*)0},{&s.f2.f0,&s.f2.f0}},{{&s.f2.f0,&s.f2.f0},{&s.f2.f0,&s.f2.f0}},{{&s.f2.f0,&s.f2.f0},{(void*)0,&s.f2.f0}}};
> +
> +       volatile int **l_68 = &l_61[0][0][1];
> +       volatile int *l_76 = &s.f2.f0;
> +       (*l_68) = l_61[0][0][0];
> +       if ((*l_76 = (p.f2 % 5))) ;
> +     }
> +   return p.f0;
> + }



--
Best Regards.

Reply via email to