On Sat, Aug 4, 2018 at 9:49 PM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Sat, Aug 4, 2018 at 12:09 PM, Uros Bizjak <ubiz...@gmail.com> wrote: >> On Sat, Aug 4, 2018 at 3:59 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>> On Sat, Aug 4, 2018 at 3:42 AM, Uros Bizjak <ubiz...@gmail.com> wrote: >>>> On Fri, Aug 3, 2018 at 12:55 AM, H.J. Lu <hongjiu...@intel.com> wrote: >>>>> We should always set cfun->machine->max_used_stack_alignment if the >>>>> maximum stack slot alignment may be greater than 64 bits. >>>>> >>>>> Tested on i686 and x86-64. OK for master and backport for GCC 8? >>>> >>>> Can you explain why 64 bits, and what this value represents? Is this >>>> value the same for 64bit and 32bit targets? >>>> >>>> Should crtl->max_used_stack_slot_alignment be compared to >>>> STACK_BOUNDARY or even MIN_STACK_BOUNDARY instead? >>> >>> In this case, we don't need to realign the incoming stack since both >>> crtl->max_used_stack_slot_alignment and crtl->preferred_stack_boundary >>> are 128 bits. We don't compute the largest alignment of stack slots to >>> keep stack frame properly aligned for it. Normally it is OK. But if >>> the largest alignment of stack slots > 64 bits and we don't keep stack >>> frame proper aligned, we will get segfault if aligned vector load/store >>> are used on these unaligned stack slots. My patch computes the >>> largest alignment of stack slots, which are actually used, if the >>> largest alignment of stack slots allocated is > 64 bits, which is >>> the smallest alignment for misaligned load/store. >> >> Does > 64 bits also hold for 32 bit targets, and -mabi=ms? I think >> that we need to compare to STACK_BOUNDARY instead: > > 64 bits requirement is independent of any psABIs nor 32-bit vs 64-bit. > cfun->machine->max_used_stack_alignment is used to decide how > stack frame should be aligned. It is always safe to compute it. I used > > else if (crtl->max_used_stack_slot_alignment > 64) > > to compute cfun->machine->max_used_stack_alignment only if > we have to. > >> --cut here-- >> Index: config/i386/i386.c >> =================================================================== >> --- config/i386/i386.c (revision 263307) >> +++ config/i386/i386.c (working copy) >> @@ -13281,8 +13281,7 @@ >> recompute_frame_layout_p = true; >> } >> } >> - else if (crtl->max_used_stack_slot_alignment >> - > crtl->preferred_stack_boundary) >> + else if (crtl->max_used_stack_slot_alignment > STACK_BOUNDARY) >> { > > This isn't correct.. cygming.h has > > #define STACK_BOUNDARY (TARGET_64BIT && ix86_abi == MS_ABI ? 128 : > BITS_PER_WORD) > > darwin.h has > > #undef STACK_BOUNDARY > #define STACK_BOUNDARY \ > ((profile_flag || (TARGET_64BIT && ix86_abi == MS_ABI)) \ > ? 128 : BITS_PER_WORD) > > i386.h has > > /* Boundary (in *bits*) on which stack pointer should be aligned. */ > #define STACK_BOUNDARY \ > (TARGET_64BIT && ix86_abi == MS_ABI ? 128 : BITS_PER_WORD) > > If STACK_BOUNDARY is 128 and max_used_stack_slot_alignment is 128, > we will get segment when 128bit aligned load/store is generated on misaligned > stack slot. > >> /* We don't need to realign stack. But we still need to keep >> stack frame properly aligned to satisfy the largest alignment >> --cut here-- >> >> (The testcase works OK with -mabi=ms, which somehow suggests that we >> don't need realignment in this case). > > We may not hit 128bit aligned load/store on misaligned stack slot in this > case. It doesn't mean that won't happen. > > else if (crtl->max_used_stack_slot_alignment > 64) > > is the correct thing to do here.
OK, but please add a comment, so in the future we will still know the purpose of the magic number. Thanks, Uros.