[llvm-commits] CVS: llvm/lib/Target/IA64/IA64.td IA64RegisterInfo.cpp IA64RegisterInfo.td

Duraid Madina duraid at octopus.com.au
Sun Jan 22 22:08:58 PST 2006



Changes in directory llvm/lib/Target/IA64:

IA64.td updated: 1.4 -> 1.5
IA64RegisterInfo.cpp updated: 1.10 -> 1.11
IA64RegisterInfo.td updated: 1.13 -> 1.14
---
Log message:


fix register corruption! (my god.) r15 is a scratch reg, using that as
a frame pointer is a pretty doofus thing to do. use r5 instead, and
mark it callee-saved, coz that's what it is!



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

 IA64.td              |    6 ++++--
 IA64RegisterInfo.cpp |   10 +++++-----
 IA64RegisterInfo.td  |    8 ++++----
 3 files changed, 13 insertions(+), 11 deletions(-)


Index: llvm/lib/Target/IA64/IA64.td
diff -u llvm/lib/Target/IA64/IA64.td:1.4 llvm/lib/Target/IA64/IA64.td:1.5
--- llvm/lib/Target/IA64/IA64.td:1.4	Wed Dec 21 21:56:03 2005
+++ llvm/lib/Target/IA64/IA64.td	Mon Jan 23 00:08:46 2006
@@ -39,9 +39,11 @@
   //'preserved' GRs:
   
   [
+    r5 // the 'frame pointer' (base pointer) reg
+
     // We never generate references to these regs, so we don't need to declare
     // that they are saved.  In fact, we could just remove them entirely.
-    //r4, r5, r6, r7,
+    //r4, r6, r7,
   
   //'special' GRs:
 
@@ -49,7 +51,7 @@
 //  r12, // memory stack pointer (SP)- XXX NOT callee saved, we do it ourselves
 //  rp, // return branch register (rp/b0) - we do this ourselves
   // **** r13 (thread pointer) we do not touch, ever. it's not here. ****//
-  //r15, // our frame pointer (FP)
+  //r15,
   
   //'stacked' GRs the RSE takes care of, we don't worry about
 /* We don't want PEI::calculateCallerSavedRegisters to worry about them,


Index: llvm/lib/Target/IA64/IA64RegisterInfo.cpp
diff -u llvm/lib/Target/IA64/IA64RegisterInfo.cpp:1.10 llvm/lib/Target/IA64/IA64RegisterInfo.cpp:1.11
--- llvm/lib/Target/IA64/IA64RegisterInfo.cpp:1.10	Mon Jan 16 20:04:52 2006
+++ llvm/lib/Target/IA64/IA64RegisterInfo.cpp	Mon Jan 23 00:08:46 2006
@@ -152,7 +152,7 @@
   int FrameIndex = MI.getOperand(i).getFrameIndex();
 
   // choose a base register: ( hasFP? framepointer : stack pointer )
-  unsigned BaseRegister = FP ? IA64::r15 : IA64::r12;
+  unsigned BaseRegister = FP ? IA64::r5 : IA64::r12;
   // Add the base register
   MI.SetMachineOperandReg(i, BaseRegister);
 
@@ -276,10 +276,10 @@
 
   // now if we need to, save the old FP and set the new
   if (FP) {
-    MI = BuildMI(IA64::ST8, 2).addReg(IA64::r12).addReg(IA64::r15);
+    MI = BuildMI(IA64::ST8, 2).addReg(IA64::r12).addReg(IA64::r5);
     MBB.insert(MBBI, MI);
     // this must be the last instr in the prolog ?  (XXX: why??)
-    MI = BuildMI(IA64::MOV, 1, IA64::r15).addReg(IA64::r12);
+    MI = BuildMI(IA64::MOV, 1, IA64::r5).addReg(IA64::r12);
     MBB.insert(MBBI, MI);
   }
 
@@ -302,10 +302,10 @@
   if (FP)
   {
     //copy the FP into the SP (discards allocas)
-    MI=BuildMI(IA64::MOV, 1, IA64::r12).addReg(IA64::r15);
+    MI=BuildMI(IA64::MOV, 1, IA64::r12).addReg(IA64::r5);
     MBB.insert(MBBI, MI);
     //restore the FP
-    MI=BuildMI(IA64::LD8, 1, IA64::r15).addReg(IA64::r15);
+    MI=BuildMI(IA64::LD8, 1, IA64::r5).addReg(IA64::r5);
     MBB.insert(MBBI, MI);
   }
 


Index: llvm/lib/Target/IA64/IA64RegisterInfo.td
diff -u llvm/lib/Target/IA64/IA64RegisterInfo.td:1.13 llvm/lib/Target/IA64/IA64RegisterInfo.td:1.14
--- llvm/lib/Target/IA64/IA64RegisterInfo.td:1.13	Mon Jan 16 20:04:52 2006
+++ llvm/lib/Target/IA64/IA64RegisterInfo.td	Mon Jan 23 00:08:46 2006
@@ -226,7 +226,7 @@
 //
 
 // these are the scratch (+stacked) general registers
-// FIXME/XXX  we also reserve a frame pointer (r15)
+// FIXME/XXX  we also reserve a frame pointer (r5)
 // FIXME/XXX  we also reserve r2 for spilling/filling predicates
 // in IA64RegisterInfo.cpp
 // FIXME/XXX  we also reserve r22 for calculating addresses
@@ -239,7 +239,7 @@
 //        registers to be the first ones allocated
 
         out7, out6, out5, out4, out3, out2, out1, out0,
-        r3,  r8,  r9,  r10, r11, r14,
+        r3,  r8,  r9,  r10, r11, r14, r15,
         r16, r17, r18, r19, r20, r21, r23,
         r24, r25, r26, r27, r28, r29, r30, r31,
         r32, r33, r34, r35, r36, r37, r38, r39,
@@ -254,7 +254,7 @@
         r104, r105, r106, r107, r108, r109, r110, r111,
         r112, r113, r114, r115, r116, r117, r118, r119,
         r120, r121, r122, r123, r124, r125, r126, r127,
-	r0, r1, r2, r12, r13, r15, r22, rp]> // the last 16 are special (look down)
+	r0, r1, r2, r5, r12, r13, r22, rp]> // the last 16 are special (look down)
   {
     let MethodProtos = [{
     iterator allocation_order_begin(MachineFunction &MF) const;
@@ -269,7 +269,7 @@
 
       GRClass::iterator
       GRClass::allocation_order_end(MachineFunction &MF) const {
-	int numReservedRegs=8; // the 8 special registers r0,r1,r2,r12,r13 etc
+	int numReservedRegs=8; // the 8 special registers r0,r1,r2,r5,r12,r13 etc
 
 	// we also can't allocate registers for use as locals if they're
 	// already required as 'out' registers






More information about the llvm-commits mailing list