http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55614



Jakub Jelinek <jakub at gcc dot gnu.org> changed:



           What    |Removed                     |Added

----------------------------------------------------------------------------

          Component|c                           |tree-optimization

      Known to work|                            |4.5.0, 4.8.0

      Known to fail|                            |4.6.3, 4.7.2



--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-12-07 
14:30:22 UTC ---

The difference from broken to working starts at the esra pass:

 <bb 3>:

-  MEM[(char * {ref-all})x_1].v = r$v_15;

+  MEM[(char * {ref-all})x_1] = r$v_15;

   x_8 = x_1 + 16;

   y_9 = y_2 + 18446744073709551600;



Note that the MEM[(char * {ref-all})x_1] is

 <mem_ref 0x7ffff1a93d48

    type <union_type 0x7ffff1a9cb28 sizes-gimplified type_0 TI

        size <integer_cst 0x7ffff1982dc0 constant 128>

        unit size <integer_cst 0x7ffff1982de0 constant 16>

        align 8 symtab 0 alias set -1 canonical type 0x7ffff1a9c738

        fields <field_decl 0x7ffff19a45f0 v type <vector_type 0x7ffff1a9c498 T>

            unsigned V4SI file rh885082.c line 7 col 13 size <integer_cst

0x7ffff1982dc0 128> unit size <integer_cst 0x7ffff1982de0 16>

            align 128 offset_align 128

            offset <integer_cst 0x7ffff1982d80 constant 0>

            bit offset <integer_cst 0x7ffff1982e00 constant 0> context

<union_type 0x7ffff1a9c738>> context <function_decl 0x7ffff1a9ba00 foo>>



    arg 0 <ssa_name 0x7ffff1985bd0

        type <pointer_type 0x7ffff1a9c5e8 type <integer_type 0x7ffff1997348

unsigned char>

            unsigned DI

            size <integer_cst 0x7ffff1982d40 constant 64>

            unit size <integer_cst 0x7ffff1982d60 constant 8>

            align 64 symtab 0 alias set -1 canonical type 0x7ffff1a9c5e8>

        visited var <parm_decl 0x7ffff1ab6000 x>def_stmt x_1 = PHI <x_10(D)(2),

x_13(3)>



        version 1

        ptr-info 0x7ffff1aa48a0>

    arg 1 <integer_cst 0x7ffff1aa63e0 type <pointer_type 0x7ffff1a9ca80>

constant 0>>



thus it has the right TYPE_ALIGN.  But when it is wrapped into COMPONENT_REF,

while the inner MEM_REF still has TYPE_ALIGN 8, the FIELD_REF has DECL_ALIGN

128, which is probably why the expansion expands it as aligned.

If the r186501 patch is too risky for the release branches (did it need any

follow-ups so far?), an alternative would be to start doing what trunk does

only

if the MEM_REF has lower alignment than the field.

Reply via email to