When we expand BIT_FIELD_REF <x_2(D), 8, 8> we can end up creating
a stack local, running into the fix.  But get_object_alignment
will return 8 for any SSA_NAME because that's not an "object" we
handle.  Deal with handled components on registers by singling out
SSA_NAME bases, using their type alignment instead of
get_object_alignment (I considered "robustifying" get_object_alignment,
but decided not to at this point).

This fixes an ICE on gcc.dg/pr41123.c on arm as reported by the CI.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

        PR middle-end/118684
        * expr.cc (expand_expr_real_1): When creating a stack local
        during expansion of a handled component, when the base is
        a SSA_NAME use its type alignment and avoid calling
        get_object_alignment.

        * gcc.dg/pr118684.c: Require automatic_stack_alignment.
---
 gcc/expr.cc                     | 4 +++-
 gcc/testsuite/gcc.dg/pr118684.c | 2 +-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/gcc/expr.cc b/gcc/expr.cc
index 95f41f69fcf..7f3149b85ee 100644
--- a/gcc/expr.cc
+++ b/gcc/expr.cc
@@ -12152,7 +12152,9 @@ expand_expr_real_1 (tree exp, rtx target, machine_mode 
tmode,
            if (!poly_int_tree_p (TYPE_SIZE_UNIT (TREE_TYPE (tem)), &size))
              size = max_int_size_in_bytes (TREE_TYPE (tem));
            memloc = assign_stack_local (TYPE_MODE (TREE_TYPE (tem)), size,
-                                        get_object_alignment (tem));
+                                        TREE_CODE (tem) == SSA_NAME
+                                        ? TYPE_ALIGN (TREE_TYPE (tem))
+                                        : get_object_alignment (tem));
            emit_move_insn (memloc, op0);
            op0 = memloc;
            clear_mem_expr = true;
diff --git a/gcc/testsuite/gcc.dg/pr118684.c b/gcc/testsuite/gcc.dg/pr118684.c
index 08cc24dc061..28fd76e366d 100644
--- a/gcc/testsuite/gcc.dg/pr118684.c
+++ b/gcc/testsuite/gcc.dg/pr118684.c
@@ -1,4 +1,4 @@
-/* { dg-do run } */
+/* { dg-do run { target automatic_stack_alignment } } */
 /* { dg-options "-O2" } */
 
 typedef int v4si __attribute__((vector_size(16)));
-- 
2.43.0

Reply via email to