Hi,
the new STV pass generates SSE instructions in 32-bit mode very late in the
pipeline and doesn't bother about realigning the stack, so it wreaks havoc on
OSes where you need to realign the stack, e.g. Windows, but I guess Solaris is
equally affected. Therefore the attached patch disables it if -mstackrealign
is enabled (the option is automatically enabled on Windows and Solaris when
SSE support is enabled), as already done for -mpreferred-stack-boundary={2,3}
and -mincoming-stack-boundary={2,3}.
Tested on x86/Windows, OK for mainline and 6 branch?
2016-08-31 Eric Botcazou <ebotca...@adacore.com>
* config/i386/i386.c (ix86_option_override_internal): Also disable the
STV pass if -mstackrealign is enabled.
--
Eric Botcazou
Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c (revision 239842)
+++ config/i386/i386.c (working copy)
@@ -5957,11 +5957,12 @@ ix86_option_override_internal (bool main_args_p,
if (!(opts_set->x_target_flags & MASK_STV))
opts->x_target_flags |= MASK_STV;
/* Disable STV if -mpreferred-stack-boundary={2,3} or
- -mincoming-stack-boundary={2,3} - the needed
+ -mincoming-stack-boundary={2,3} or -mstackrealign - the needed
stack realignment will be extra cost the pass doesn't take into
account and the pass can't realign the stack. */
if (ix86_preferred_stack_boundary < 128
- || ix86_incoming_stack_boundary < 128)
+ || ix86_incoming_stack_boundary < 128
+ || opts->x_ix86_force_align_arg_pointer)
opts->x_target_flags &= ~MASK_STV;
if (!ix86_tune_features[X86_TUNE_AVX256_UNALIGNED_LOAD_OPTIMAL]
&& !(opts_set->x_target_flags & MASK_AVX256_SPLIT_UNALIGNED_LOAD))