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

--- Comment #12 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to rguent...@suse.de from comment #10)
> The array assignment from the front-end is good enough for the
> middle-end as far as IL type hygiene is concerned given the
> element types are useless-type-convertible.

Note, this has actually nothing to do with the frontend.
It initializes the types array correctly, I see INIT_EXPR with the types array
as first operand and CONSTRUCTOR with E[3] type which has values 0, 1, 2 (all
with E type).
But, on aarch64 (unlike x86_64 in this case) the gimplifier decides to use
tree_output_constant_def and initialize the array from loading that (rather
than e.g. initializing it elementwise).  And that (through compare_constant)
intentionally ignores some type differences:
        if (typecode == ARRAY_TYPE)
          {
            HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
            /* For arrays, check that mode, size and storage order match.  */
            if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
                || size_1 == -1
                || size_1 != int_size_in_bytes (TREE_TYPE (t2))
                || TYPE_REVERSE_STORAGE_ORDER (TREE_TYPE (t1))
                   != TYPE_REVERSE_STORAGE_ORDER (TREE_TYPE (t2)))
              return false;
          }
        else
          {
            /* For record and union constructors, require exact type
               equality.  */
            if (TREE_TYPE (t1) != TREE_TYPE (t2))
              return false;
          }

And given that there is a similar initializer with the exact same values
earlier but int type (the arr initializer, also { 0, 1, 2 }),
tree_output_constant_def just reuses that .LC0 var instead of creating a new
one.

So, I think this is solely a SRA bug.
Martin, could you please have a look?

Reply via email to