Bug/case fixes:
authorVikram S. Adve <vadve@cs.uiuc.edu>
Wed, 2 Jul 2003 01:13:57 +0000 (01:13 +0000)
committerVikram S. Adve <vadve@cs.uiuc.edu>
Wed, 2 Jul 2003 01:13:57 +0000 (01:13 +0000)
(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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7051 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/SparcV9/SparcV9InstrSelection.cpp
lib/Target/SparcV9/SparcV9RegInfo.cpp

index 6576ef96cec4175b7026007b2eee504ee62717b3..086b4a34f3423ec7165cfd18430ca212add45e56 100644 (file)
@@ -477,14 +477,15 @@ ChooseConvertToFloatInstr(OpLabel vopCode, const Type* opType)
       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 fbed00072722532d0c67cb8a45933c0dae08e5d9..95bd87f9505012fbff2f23728cd5987a8f5f043d 100644 (file)
@@ -942,14 +942,23 @@ void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI,
   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 @@ UltraSparcRegInfo::insertCallerSavingCode
            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 @@ UltraSparcRegInfo::insertCallerSavingCode
             
            //---- 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