[llvm-commits] [llvm] r123567 - in /llvm/trunk: lib/Target/ARM/ARMFrameLowering.cpp test/CodeGen/Thumb/2011-EpilogueBug.ll

Evan Cheng evan.cheng at apple.com
Sat Jan 15 21:14:33 PST 2011


Author: evancheng
Date: Sat Jan 15 23:14:33 2011
New Revision: 123567

URL: http://llvm.org/viewvc/llvm-project?rev=123567&view=rev
Log:
Spill R4 if it's going to be used to restore SP from FP.

Added:
    llvm/trunk/test/CodeGen/Thumb/2011-EpilogueBug.ll
Modified:
    llvm/trunk/lib/Target/ARM/ARMFrameLowering.cpp

Modified: llvm/trunk/lib/Target/ARM/ARMFrameLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMFrameLowering.cpp?rev=123567&r1=123566&r2=123567&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMFrameLowering.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMFrameLowering.cpp Sat Jan 15 23:14:33 2011
@@ -801,15 +801,23 @@
 
   // Spill R4 if Thumb2 function requires stack realignment - it will be used as
   // scratch register. Also spill R4 if Thumb2 function has varsized objects,
-  // since it's always posible to restore sp from fp in a single instruction.
+  // since it's not always possible to restore sp from fp in a single
+  // instruction.
   // FIXME: It will be better just to find spare register here.
   if (AFI->isThumb2Function() &&
       (MFI->hasVarSizedObjects() || RegInfo->needsStackRealignment(MF)))
     MF.getRegInfo().setPhysRegUsed(ARM::R4);
 
-  // Spill LR if Thumb1 function uses variable length argument lists.
-  if (AFI->isThumb1OnlyFunction() && AFI->getVarArgsRegSaveSize() > 0)
-    MF.getRegInfo().setPhysRegUsed(ARM::LR);
+  if (AFI->isThumb1OnlyFunction()) {
+    // Spill LR if Thumb1 function uses variable length argument lists.
+    if (AFI->getVarArgsRegSaveSize() > 0)
+      MF.getRegInfo().setPhysRegUsed(ARM::LR);
+
+    // Spill R4 if Thumb1 epilogue has to restore SP from FP since 
+    // FIXME: It will be better just to find spare register here.
+    if (MFI->hasVarSizedObjects())
+      MF.getRegInfo().setPhysRegUsed(ARM::R4);
+  }
 
   // Spill the BasePtr if it's used.
   if (RegInfo->hasBasePointer(MF))

Added: llvm/trunk/test/CodeGen/Thumb/2011-EpilogueBug.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Thumb/2011-EpilogueBug.ll?rev=123567&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/Thumb/2011-EpilogueBug.ll (added)
+++ llvm/trunk/test/CodeGen/Thumb/2011-EpilogueBug.ll Sat Jan 15 23:14:33 2011
@@ -0,0 +1,17 @@
+; RUN: llc -mtriple=thumbv6-apple-darwin < %s | FileCheck %s
+; r8869722
+
+%struct.state = type { i32, %struct.info*, float**, i32, i32, i32, i32, i32, i32, i32, i32, i32, i64, i64, i64, i64, i64, i64, i8* }
+%struct.info = type { i32, i32, i32, i32, i32, i32, i32, i8* }
+
+define void @t1(%struct.state* %v) {
+; CHECK: push {r4
+  %tmp6 = load i32* null
+  %tmp8 = alloca float, i32 %tmp6
+  store i32 1, i32* null
+  br label %return
+
+return:                                           ; preds = %0
+; CHECK: mov sp, r4
+  ret void
+}





More information about the llvm-commits mailing list