[llvm] r206366 - ARM64: mark x7 as used when an i128 gets shunted onto the stack.

Tim Northover tnorthover at apple.com
Wed Apr 16 02:03:26 PDT 2014


Author: tnorthover
Date: Wed Apr 16 04:03:25 2014
New Revision: 206366

URL: http://llvm.org/viewvc/llvm-project?rev=206366&view=rev
Log:
ARM64: mark x7 as used when an i128 gets shunted onto the stack.

The second half of a split i128 was ending up in x7, which is not a good thing.

This is another part of PR19432.

Modified:
    llvm/trunk/lib/Target/ARM64/ARM64CallingConvention.td
    llvm/trunk/test/CodeGen/ARM64/aapcs.ll

Modified: llvm/trunk/lib/Target/ARM64/ARM64CallingConvention.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM64/ARM64CallingConvention.td?rev=206366&r1=206365&r2=206366&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM64/ARM64CallingConvention.td (original)
+++ llvm/trunk/lib/Target/ARM64/ARM64CallingConvention.td Wed Apr 16 04:03:25 2014
@@ -36,7 +36,7 @@ def CC_ARM64_AAPCS : CallingConv<[
                                                     [X0, X1, X3, X5]>>>,
 
   // i128 is split to two i64s, and its stack alignment is 16 bytes.
-  CCIfType<[i64], CCIfSplit<CCAssignToStack<8, 16>>>,
+  CCIfType<[i64], CCIfSplit<CCAssignToStackWithShadow<8, 16, [X7]>>>,
 
   CCIfType<[i64], CCAssignToRegWithShadow<[X0, X1, X2, X3, X4, X5, X6, X7],
                                           [W0, W1, W2, W3, W4, W5, W6, W7]>>,

Modified: llvm/trunk/test/CodeGen/ARM64/aapcs.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM64/aapcs.ll?rev=206366&r1=206365&r2=206366&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM64/aapcs.ll (original)
+++ llvm/trunk/test/CodeGen/ARM64/aapcs.ll Wed Apr 16 04:03:25 2014
@@ -84,3 +84,13 @@ define void @test_variadic() {
 ; CHECK: bl variadic
   ret void
 }
+
+; We weren't marking x7 as used after deciding that the i128 didn't fit into
+; registers and putting the first half on the stack, so the *second* half went
+; into x7. Yuck!
+define i128 @test_i128_shadow([7 x i64] %x0_x6, i128 %sp) {
+; CHECK-LABEL: test_i128_shadow:
+; CHECK: ldp x0, x1, [sp]
+
+  ret i128 %sp
+}





More information about the llvm-commits mailing list