https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69454
--- Comment #27 from H.J. Lu <hjl.tools at gmail dot com> ---
(In reply to Ilya Enkovich from comment #26)
> (In reply to H.J. Lu from comment #25)
> > Please add -mpreferred-stack-boundary=2 to your tests. Otherwise,
> > you just remove a nop.
>
> Here is a test which crashes LRA with the path you proposed. Crash happens
> because LRA requests a stack slot aligned by 8 and stack is aligned by 4.
> So Jakub's patch looks the safest option for now, but probably use 64
> requirement instead of 128.
>
> >cat test.i
> long long a, b;
> fn1() {
> long long c = a;
> a = b ^ a;
> fn2();
> a = c;
> }
> >gcc test.i -O2 -m32 -mpreferred-stack-boundary=2
> test.i: In function 'fn1':
> test.i:5:3: warning: implicit declaration of function 'fn2'
> [-Wimplicit-function-declaration]
> fn2();
> ^~~
>
> test.i:7:1: internal compiler error: in assign_stack_local_1, at
> function.c:409
The last place to update stack alignment is ix86_update_stack_boundary.
Try
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index a03a515..10a00f8 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -3588,16 +3588,6 @@ convert_scalars_to_vector ()
bitmap_obstack_release (NULL);
df_process_deferred_rescans ();
- /* Conversion means we may have 128bit register spills/fills
- which require aligned stack. */
- if (converted_insns)
- {
- if (crtl->stack_alignment_needed < 128)
- crtl->stack_alignment_needed = 128;
- if (crtl->stack_alignment_estimated < 128)
- crtl->stack_alignment_estimated = 128;
- }
-
return 0;
}
@@ -12041,6 +12031,13 @@ ix86_update_stack_boundary (void)
if (crtl->stack_alignment_needed < 128)
crtl->stack_alignment_needed = 128;
}
+
+ /* The STV pass needs 64-bit stack alignment. */
+ if (!TARGET_64BIT
+ && TARGET_STV
+ && TARGET_SSE2 && optimize > 1
+ && crtl->stack_alignment_estimated < 64)
+ crtl->stack_alignment_estimated = 64;
}
/* Handle the TARGET_GET_DRAP_RTX hook. Return NULL if no DRAP is