[llvm] r214980 - Round up the size of byval arguments to MinAlign

Reid Kleckner reid at kleckner.net
Wed Aug 6 10:57:23 PDT 2014


Author: rnk
Date: Wed Aug  6 12:57:23 2014
New Revision: 214980

URL: http://llvm.org/viewvc/llvm-project?rev=214980&view=rev
Log:
Round up the size of byval arguments to MinAlign

Otherwise we can end up with an argument frame size that is not a
multiple of stack slot size, which is very awkward.

This fixes PR20547, which was a bug in x86_64 Sys V vararg handling.
However, it's much easier to test this with x86 callee-cleanup
functions, which previously ended in "retl $6" instead of "retl $8".

This does affect behavior of all backends, but it presumably fixes the
same bug in all of them.

Added:
    llvm/trunk/test/CodeGen/X86/byval-callee-cleanup.ll
Modified:
    llvm/trunk/lib/CodeGen/CallingConvLower.cpp

Modified: llvm/trunk/lib/CodeGen/CallingConvLower.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CallingConvLower.cpp?rev=214980&r1=214979&r2=214980&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/CallingConvLower.cpp (original)
+++ llvm/trunk/lib/CodeGen/CallingConvLower.cpp Wed Aug  6 12:57:23 2014
@@ -52,6 +52,7 @@ void CCState::HandleByVal(unsigned ValNo
     Align = MinAlign;
   MF.getFrameInfo()->ensureMaxAlignment(Align);
   TM.getSubtargetImpl()->getTargetLowering()->HandleByVal(this, Size, Align);
+  Size = unsigned(RoundUpToAlignment(Size, MinAlign));
   unsigned Offset = AllocateStack(Size, Align);
   addLoc(CCValAssign::getMem(ValNo, ValVT, Offset, LocVT, LocInfo));
 }

Added: llvm/trunk/test/CodeGen/X86/byval-callee-cleanup.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/byval-callee-cleanup.ll?rev=214980&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/byval-callee-cleanup.ll (added)
+++ llvm/trunk/test/CodeGen/X86/byval-callee-cleanup.ll Wed Aug  6 12:57:23 2014
@@ -0,0 +1,28 @@
+; RUN: llc < %s -march=x86 | FileCheck %s
+
+; Previously we would forget to align to stack slot alignment after placing a
+; byval argument.  Subsequent arguments would align themselves, but if it was
+; the last argument, the argument size would not be a multiple of stack slot
+; size. This resulted in retl $6 in callee-cleanup functions, as well as subtle
+; varargs bugs.
+
+%struct.Six = type { [6 x i8] }
+
+define x86_stdcallcc void @f(%struct.Six* byval %a) {
+  ret void
+}
+; CHECK-LABEL: _f at 8:
+; CHECK: retl $8
+
+define x86_thiscallcc void @g(i8* %this, %struct.Six* byval %a) {
+  ret void
+}
+; CHECK-LABEL: _g:
+; CHECK: retl $8
+
+define x86_fastcallcc void @h(i32 inreg %x, i32 inreg %y, %struct.Six* byval %a) {
+  ret void
+}
+; FIXME: This should be @h at 8.
+; CHECK-LABEL: @h at 16:
+; CHECK: retl $8





More information about the llvm-commits mailing list