https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118924

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|rguenth at gcc dot gnu.org         |unassigned at gcc dot 
gnu.org
                 CC|                            |rguenth at gcc dot gnu.org
             Status|ASSIGNED                    |NEW

--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> ---
So the issue with the C++ frontend is that the load

    E primType = *begin;

does not alias the initialization

  E types[3] = {POINTS, LINES, TRIANGLES};

due to TBAA.

 <array_ref 0x7ffff6741038
    type <integer_type 0x7ffff68235e8 int sizes-gimplified public type_6 SI
        size <integer_cst 0x7ffff681a480 constant 32>
        unit-size <integer_cst 0x7ffff681a498 constant 4>
        align:32 warn_if_not_align:0 symtab:0 alias-set 2 canonical-type
0x7ffff68235e8 precision:32 min <integer_cst 0x7ffff681a438 -2147483648> max
<integer_cst 0x7ffff681a450 2147483647>
        pointer_to_this <pointer_type 0x7ffff682ab28>>

    arg:0 <var_decl 0x7ffff671f558 types
        type <array_type 0x7ffff6732690 type <enumeral_type 0x7ffff6726738 E>

vs.

 <mem_ref 0x7ffff673a0c8
    type <enumeral_type 0x7ffff6726738 E
        type <integer_type 0x7ffff68235e8 int sizes-gimplified public type_6 SI
            size <integer_cst 0x7ffff681a480 constant 32>
            unit-size <integer_cst 0x7ffff681a498 constant 4>
            align:32 warn_if_not_align:0 symtab:0 alias-set 2 canonical-type
0x7ffff68235e8 precision:32 min <integer_cst 0x7ffff681a438 -2147483648> max
<integer_cst 0x7ffff681a450 2147483647>
            pointer_to_this <pointer_type 0x7ffff682ab28>>
        sizes-gimplified type_5 type_6 SI size <integer_cst 0x7ffff681a480 32>
unit-size <integer_cst 0x7ffff681a498 4>
        align:32 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
0x7ffff6726690 precision:32 min <integer_cst 0x7ffff681a438 -2147483648> max
<integer_cst 0x7ffff681a450 2147483647>
        values <tree_list 0x7ffff6729320
            purpose <identifier_node 0x7ffff6725700 POINTS
                normal local bindings <(nil)>> value <const_decl 0x7ffff6805780
POINTS>
            chain <tree_list 0x7ffff6729348
                purpose <identifier_node 0x7ffff6725740 LINES
                    normal local bindings <(nil)>> value <const_decl
0x7ffff68057f8 LINES>
                chain <tree_list 0x7ffff6729370
                    purpose <identifier_node 0x7ffff6725780 TRIANGLES
                        normal local bindings <(nil)>> value <const_decl
0x7ffff6805870 TRIANGLES>>>> context <translation_unit_decl 0x7ffff6821000 t.c>
        pointer_to_this <pointer_type 0x7ffff67327e0> chain <type_decl
0x7ffff6705dc0 E>>

    arg:0 <ssa_name 0x7ffff67335e8


on GENERIC we have

  <<cleanup_point   ED.4500 typesD.4542[3] = {0, 1, 2};>>;
  {

gimplified to

       typesD.4542 = *.LC0D.4557;

and SRAed to

  typesD.4542[0] = SR.4_14;

the C frontend likely uses an integer type for the indirect enum access
that is compatible with the plain int type used by SRA.

It looks like SRA is confused by the .LC0 initializer having array of integer
rather than array of Enum type and it takes that as a model for building
the LHS access.  That model is created by totally_scalarize_subtree
from the integer type constant decl which is eventually created from the
integer array type CONSTRUCTOR emitted by the C++ frontend:

 <constructor 0x7ffff6724690
    type <array_type 0x7ffff67262a0
        type <integer_type 0x7ffff68235e8 int sizes-gimplified public type_6 SI
            size <integer_cst 0x7ffff681a480 constant 32>
...
    constant static length:3
    idx <integer_cst 0x7ffff681a270 type <integer_type 0x7ffff6823000 sizetype>
constant 0>
    val <integer_cst 0x7ffff681a5d0 type <integer_type 0x7ffff68235e8 int>
constant 0>
    idx <integer_cst 0x7ffff681a348 type <integer_type 0x7ffff6823000 sizetype>
constant 1>
...

it is of course naiive for SRA to use a model that's not TBAA compatible
with the original aggregate store, but the C++ frontend isn't helpful here
in emitting this kind of assignment.

Leaving to Martin to figure where to plug this in SRA.

Reply via email to