On Thu, Jan 28, 2016 at 04:42:02AM -0800, H.J. Lu wrote: > >>>>>> 2016-01-27 Jakub Jelinek <ja...@redhat.com> > >>>>>> Ilya Enkovich <enkovich....@gmail.com> > >>>>>> > >>>>>> PR target/69454 > >>>>>> * config/i386/i386.c (convert_scalars_to_vector): Remove > >>>>>> stack alignment fixes. > >>>>>> (ix86_option_override_internal): Disable TARGET_STV if stack > >>>>>> is not properly aligned. > >>>>>> > >>>>>> gcc/testsuite/ > >>>>>> > >>>>>> 2016-01-27 Ilya Enkovich <enkovich....@gmail.com> > >>>>>> > >>>>>> PR target/69454 > >>>>>> * gcc.target/i386/pr69454-1.c: New test. > >>>>>> * gcc.target/i386/pr69454-2.c: New test. > >>>>>> > >>>>>> > >>>>>> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c > >>>>>> index 34b57a4..9fb8db8 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; > >>>>>> } > >>>>>> > >>>>>> @@ -5453,6 +5443,11 @@ ix86_option_override_internal (bool main_args_p, > >>>>>> opts->x_target_flags |= MASK_VZEROUPPER; > >>>>>> if (!(opts_set->x_target_flags & MASK_STV)) > >>>>>> opts->x_target_flags |= MASK_STV; > >>>>>> + /* Disable STV if -mpreferred-stack-boundary=2 - 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 < 64) > >>>>>> + opts->x_target_flags &= ~MASK_STV; > >> > >> This won't work for 32-bit incoming stack boundary and 64-bit preferred > >> stack boundary. In this case, STV won't be off. When LRA needs 64-bit > >> aligned stack slot, stack must be realigned. But for leaf function, we may > >> not realign stack if ix86_minimum_alignment returns 32 for DImode. You > >> must either add assert (!TARGET_STV) before returning 32 for DImode or > >> return 64 for DImode if STV is on in ix86_minimum_alignment. > > > > TARGET_STV doesn't mean STV pass will run. We can check alignment in STV > > pass gate and this assert would be wrong. If we decide STV to be dependent > > on > > stack alignment then we shouldn't make alignment be dependent on STV. I can > > add > > assert into convert_scalars_to_vector to check > > crtl->stack_alignment_estimated >= 64 > > by that moment. > > > > The bottom line is ix86_minimum_alignment must return the correct > number for DImode or you can just turn off STV. My suggestion is > to use my patch.
Uros, any preferences here? I mean, it is possible to use e.g. the ix86_option_override_internal and have H.J's ix86_minimum_alignment change as a safety net, in the usual case for -mpreferred-stack-boundary=2 we'll just disable TARGET_STV and ix86_minimum_alignment change won't do anything, as TARGET_STV will be false, and if for whatever case it gets through (target attribute, -mincoming-stack-boundary=, ...) ix86_minimum_alignment will be there to ensure enough stack alignment. Most of the smaller -mpreferred-stack-boundary= uses are -mno-sse anyway, and that is something we don't want to affect. Jakub