diff --git a/llvm/lib/Target/Sparc/SparcInstrSelection.cpp b/llvm/lib/Target/Sparc/SparcInstrSelection.cpp index 6576ef96cec4..086b4a34f342 100644 --- a/llvm/lib/Target/Sparc/SparcInstrSelection.cpp +++ b/llvm/lib/Target/Sparc/SparcInstrSelection.cpp @@ -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(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; } diff --git a/llvm/lib/Target/Sparc/SparcRegInfo.cpp b/llvm/lib/Target/Sparc/SparcRegInfo.cpp index fbed00072722..95bd87f95050 100644 --- a/llvm/lib/Target/Sparc/SparcRegInfo.cpp +++ b/llvm/lib/Target/Sparc/SparcRegInfo.cpp @@ -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 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 AdIBef, AdIAft; - //---- Insert code for pushing the reg on stack ---------- + std::vector 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