[llvm-commits] CVS: llvm/lib/Target/ARM/ARMRegisterInfo.cpp

Evan Cheng evan.cheng at apple.com
Mon Feb 5 22:13:45 PST 2007



Changes in directory llvm/lib/Target/ARM:

ARMRegisterInfo.cpp updated: 1.57 -> 1.58
---
Log message:

foldMemoryOperand() cannot fold tMOVrr sp into load / store in thumb mode. tLDRspi / tSTRspi cannot target / store high registers.

---
Diffs of the changes:  (+19 -13)

 ARMRegisterInfo.cpp |   32 +++++++++++++++++++-------------
 1 files changed, 19 insertions(+), 13 deletions(-)


Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp
diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.57 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.58
--- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.57	Mon Feb  5 18:23:31 2007
+++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp	Tue Feb  6 00:13:29 2007
@@ -185,6 +185,19 @@
     abort();
 }
 
+/// isLowRegister - Returns true if the register is low register r0-r7.
+///
+static bool isLowRegister(unsigned Reg) {
+  using namespace ARM;
+  switch (Reg) {
+  case R0:  case R1:  case R2:  case R3:
+  case R4:  case R5:  case R6:  case R7:
+    return true;
+  default:
+    return false;
+  }
+}
+
 MachineInstr *ARMRegisterInfo::foldMemoryOperand(MachineInstr *MI,
                                                  unsigned OpNum, int FI) const {
   unsigned Opc = MI->getOpcode();
@@ -206,10 +219,16 @@
   case ARM::tMOVrr: {
     if (OpNum == 0) { // move -> store
       unsigned SrcReg = MI->getOperand(1).getReg();
+      if (!isLowRegister(SrcReg))
+        // tSTRspi cannot take a high register operand.
+        break;
       NewMI = BuildMI(TII.get(ARM::tSTRspi)).addReg(SrcReg).addFrameIndex(FI)
         .addImm(0);
     } else {          // move -> load
       unsigned DstReg = MI->getOperand(0).getReg();
+      if (!isLowRegister(DstReg))
+        // tLDRspi cannot target a high register operand.
+        break;
       NewMI = BuildMI(TII.get(ARM::tLDRspi), DstReg).addFrameIndex(FI)
         .addImm(0);
     }
@@ -316,19 +335,6 @@
   }
 }
 
-/// isLowRegister - Returns true if the register is low register r0-r7.
-///
-static bool isLowRegister(unsigned Reg) {
-  using namespace ARM;
-  switch (Reg) {
-  case R0:  case R1:  case R2:  case R3:
-  case R4:  case R5:  case R6:  case R7:
-    return true;
-  default:
-    return false;
-  }
-}
-
 /// calcNumMI - Returns the number of instructions required to materialize
 /// the specific add / sub r, c instruction.
 static unsigned calcNumMI(int Opc, int ExtraOpc, unsigned Bytes,






More information about the llvm-commits mailing list