ARM fix: Miscompilation when frame pointer can't be eliminated. Uninitialized frame...
authorLauro Ramos Venancio <lauro.venancio@gmail.com>
Wed, 31 Jan 2007 13:12:46 +0000 (13:12 +0000)
committerLauro Ramos Venancio <lauro.venancio@gmail.com>
Wed, 31 Jan 2007 13:12:46 +0000 (13:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33703 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMRegisterInfo.cpp
test/CodeGen/ARM/hello.ll
test/CodeGen/ARM/insn-sched1.ll
test/CodeGen/ARM/ldm.ll

index d04bf9130e9366544a6b00a0ffc3592146ad4bdc..b7d8b19cbbeb698ef5cf283f0ebea7ae4e3c073c 100644 (file)
@@ -573,8 +573,7 @@ void ARMRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II) const{
     // There is alloca()'s in this function, must reference off the frame
     // pointer instead.
     FrameReg = getFrameRegister(MF);
-    if (STI.isTargetDarwin())
-      Offset -= AFI->getFramePtrSpillOffset();
+    Offset -= AFI->getFramePtrSpillOffset();
   }
 
   unsigned Opcode = MI.getOpcode();
@@ -882,6 +881,12 @@ processFunctionBeforeCalleeSavedScan(MachineFunction &MF) const {
     }
   }
 
+  if (hasFP(MF)) {
+    MF.changePhyRegUsed(FramePtr, true);
+    NumGPRSpills++;
+    CanEliminateFrame = false;
+  }
+
   if (!CanEliminateFrame) {
     AFI->setHasStackFrame(true);
 
@@ -895,11 +900,6 @@ processFunctionBeforeCalleeSavedScan(MachineFunction &MF) const {
       ForceLRSpill = false;
     }
 
-    if (STI.isTargetDarwin()) {
-      MF.changePhyRegUsed(FramePtr, true);
-      NumGPRSpills++;
-    }
-
     // If stack and double are 8-byte aligned and we are spilling an odd number
     // of GPRs. Spill one extra callee save GPR so we won't have to pad between
     // the integer and double callee save areas.
@@ -1030,7 +1030,7 @@ void ARMRegisterInfo::emitPrologue(MachineFunction &MF) const {
     ++MBBI;
 
   // Point FP to the stack slot that contains the previous FP.
-  if (STI.isTargetDarwin())
+  if (hasFP(MF))
     BuildMI(MBB, MBBI, TII.get(isThumb ? ARM::tADDrSPi : ARM::ADDri), FramePtr)
       .addFrameIndex(FramePtrSpillFI).addImm(0);
 
@@ -1116,7 +1116,7 @@ void ARMRegisterInfo::emitEpilogue(MachineFunction &MF,
   if (isThumb)
     emitSPUpdate(MBB, MBBI, NumBytes, isThumb, TII);
   else {
-    if (STI.isTargetDarwin()) {
+    if (hasFP(MF)){
       NumBytes = AFI->getFramePtrSpillOffset() - NumBytes;
       // Reset SP based on frame pointer only if the stack frame extends beyond
       // frame pointer stack slot.
@@ -1131,7 +1131,6 @@ void ARMRegisterInfo::emitEpilogue(MachineFunction &MF,
     } else if (NumBytes) {
       emitSPUpdate(MBB, MBBI, NumBytes, false, TII);
     }
-
     // Move SP to start of integer callee save spill area 2.
     movePastCSLoadStoreOps(MBB, MBBI, ARM::FLDD, 3, STI);
     emitSPUpdate(MBB, MBBI, AFI->getDPRCalleeSavedAreaSize(), false, TII);
index abf6b4c0400d0eb50288cb623e990e39a4daa2d6..fd4fa0126fcbf8a475a116d47b590e8d0401832c 100644 (file)
@@ -1,6 +1,6 @@
 ; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm &&
 ; RUN: llvm-upgrade < %s | llvm-as | llc -mtriple=arm-linux | grep mov | wc -l | grep 1 &&
-; RUN: llvm-upgrade < %s | llvm-as | llc -mtriple=arm-apple-darwin | grep mov | wc -l | grep 2
+; RUN: llvm-upgrade < %s | llvm-as | llc -mtriple=arm-apple-darwin --disable-fp-elim | grep mov | wc -l | grep 2
 
 %str = internal constant [12 x sbyte] c"Hello World\00"
 
index 5c9a28a1d714bf625a64ce0428895d073064b5e8..a9309011c4d06ecc0ff36a7ba89bc56daff44557 100644 (file)
@@ -1,5 +1,5 @@
 ; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm -mattr=+v6 &&
-; RUN: llvm-upgrade < %s | llvm-as | llc -mtriple=arm-apple-darwin -mattr=+v6 | grep mov | wc -l | grep 2
+; RUN: llvm-upgrade < %s | llvm-as | llc -mtriple=arm-apple-darwin -mattr=+v6 --disable-fp-elim | grep mov | wc -l | grep 2
 
 int %test(int %x) {
        %tmp = cast int %x to short
index bef0687795fb00fb9885b3caa0672e5337b1ceec..0a25186be5121955f0eac9376854e98f308a809c 100644 (file)
@@ -1,7 +1,7 @@
 ; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm &&
 ; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm | grep "ldmia" | wc -l | grep 2 &&
 ; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm | grep "ldmib" | wc -l | grep 1 &&
-; RUN: llvm-upgrade < %s | llvm-as | llc -mtriple=arm-apple-darwin | grep "ldmfd sp\!" | wc -l | grep 3
+; RUN: llvm-upgrade < %s | llvm-as | llc -mtriple=arm-apple-darwin --disable-fp-elim | grep "ldmfd sp\!" | wc -l | grep 3
 
 %X = external global [0 x int]