[llvm-commits] CVS: llvm/lib/Target/Sparc/SparcInstrSelection.cpp SparcRegInfo.cpp

Vikram Adve vadve at cs.uiuc.edu
Tue Jul 1 20:15:01 PDT 2003


Changes in directory llvm/lib/Target/Sparc:

SparcInstrSelection.cpp updated: 1.103 -> 1.104
SparcRegInfo.cpp updated: 1.99 -> 1.100

---
Log message:

Bug/case fixes:
(1) select: Ok to convert a pointer to a float or double.
(2) regalloc: Some MachineInstr* for caller-saving code before a call
    were being inserted before and after the call!
(3) Don't insert the caller-saving instructions in the
    MachineCodeForInstruction for the Call instruction.
    *All* instructions generated by register allocation need to be
    recorded in those maps, but it needs to be done uniformly.


---
Diffs of the changes:

Index: llvm/lib/Target/Sparc/SparcInstrSelection.cpp
diff -u llvm/lib/Target/Sparc/SparcInstrSelection.cpp:1.103 llvm/lib/Target/Sparc/SparcInstrSelection.cpp:1.104
--- llvm/lib/Target/Sparc/SparcInstrSelection.cpp:1.103	Sun Jun 22 21:13:57 2003
+++ llvm/lib/Target/Sparc/SparcInstrSelection.cpp	Tue Jul  1 20:13:57 2003
@@ -477,14 +477,15 @@
       opType == Type::ShortTy || opType == Type::UShortTy ||
       opType == Type::IntTy   || opType == Type::UIntTy)
       opCode = (vopCode == ToFloatTy? V9::FITOS : V9::FITOD);
-  else if (opType == Type::LongTy || opType == Type::ULongTy)
+  else if (opType == Type::LongTy || opType == Type::ULongTy ||
+           isa<PointerType>(opType))
       opCode = (vopCode == ToFloatTy? V9::FXTOS : V9::FXTOD);
   else if (opType == Type::FloatTy)
       opCode = (vopCode == ToFloatTy? V9::INVALID_OPCODE : V9::FSTOD);
   else if (opType == Type::DoubleTy)
       opCode = (vopCode == ToFloatTy? V9::FDTOS : V9::INVALID_OPCODE);
   else
-    assert(0 && "Cannot convert this type to DOUBLE on SPARC");
+    assert(0 && "Trying to convert a non-scalar type to DOUBLE?");
   
   return opCode;
 }


Index: llvm/lib/Target/Sparc/SparcRegInfo.cpp
diff -u llvm/lib/Target/Sparc/SparcRegInfo.cpp:1.99 llvm/lib/Target/Sparc/SparcRegInfo.cpp:1.100
--- llvm/lib/Target/Sparc/SparcRegInfo.cpp:1.99	Mon Jun 16 07:03:00 2003
+++ llvm/lib/Target/Sparc/SparcRegInfo.cpp	Tue Jul  1 20:13:57 2003
@@ -942,14 +942,23 @@
   for(unsigned i=0; i < ReorderedVec.size(); i++)
     CallAI->InstrnsBefore.push_back( ReorderedVec[i] );
 
-  //Insert machine instructions before and after call into the
-  //call instructions map --- Anand
-  const CallInst *callInst = argDesc->getCallInst();
-  MachineCodeForInstruction &mvec = MachineCodeForInstruction::get(callInst);
-  mvec.insert(mvec.begin(), CallAI->InstrnsBefore.begin(), 
-	      CallAI->InstrnsBefore.end());
-  mvec.insert(mvec.end(), CallAI->InstrnsAfter.begin(), 
-	      CallAI->InstrnsAfter.end());
+#ifndef NDEBUG
+  // Temporary sanity checking code to detect whether the same machine
+  // instruction is ever inserted twice before/after a call.
+  // I suspect this is happening but am not sure. --Vikram, 7/1/03.
+  // 
+  std::set<const MachineInstr*> instrsSeen;
+  for (int i = 0, N = CallAI->InstrnsBefore.size(); i < N; ++i) {
+    assert(instrsSeen.find(CallAI->InstrnsBefore[i]) == instrsSeen.end() &&
+           "Duplicate machine instruction in InstrnsBefore!");
+    instrsSeen.insert(CallAI->InstrnsBefore[i]);
+  } 
+  for (int i = 0, N = CallAI->InstrnsAfter.size(); i < N; ++i) {
+    assert(instrsSeen.find(CallAI->InstrnsAfter[i]) == instrsSeen.end() &&
+           "Duplicate machine instruction in InstrnsBefore/After!");
+    instrsSeen.insert(CallAI->InstrnsAfter[i]);
+  } 
+#endif
 }
 
 //---------------------------------------------------------------------------
@@ -1361,10 +1370,10 @@
 	    int StackOff =
               PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
             
-	    std::vector<MachineInstr*> AdIBef, AdIAft;
-            
 	    //---- Insert code for pushing the reg on stack ----------
             
+	    std::vector<MachineInstr*> AdIBef, AdIAft;
+            
             // We may need a scratch register to copy the saved value
             // to/from memory.  This may itself have to insert code to
             // free up a scratch register.  Any such code should go before
@@ -1395,6 +1404,9 @@
             
 	    //---- Insert code for popping the reg from the stack ----------
 
+	    AdIBef.clear();
+            AdIAft.clear();
+            
             // We may need a scratch register to copy the saved value
             // from memory.  This may itself have to insert code to
             // free up a scratch register.  Any such code should go





More information about the llvm-commits mailing list