From 784a18b8ba5e3ad2da2fc3503d453f4593f7eaaf Mon Sep 17 00:00:00 2001 From: "Vikram S. Adve" Date: Wed, 2 Jul 2003 01:13:57 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7051 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/SparcV9/SparcV9InstrSelection.cpp | 5 +-- lib/Target/SparcV9/SparcV9RegInfo.cpp | 32 ++++++++++++++------ 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/lib/Target/SparcV9/SparcV9InstrSelection.cpp b/lib/Target/SparcV9/SparcV9InstrSelection.cpp index 6576ef96cec..086b4a34f34 100644 --- a/lib/Target/SparcV9/SparcV9InstrSelection.cpp +++ b/lib/Target/SparcV9/SparcV9InstrSelection.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/lib/Target/SparcV9/SparcV9RegInfo.cpp b/lib/Target/SparcV9/SparcV9RegInfo.cpp index fbed0007272..95bd87f9505 100644 --- a/lib/Target/SparcV9/SparcV9RegInfo.cpp +++ b/lib/Target/SparcV9/SparcV9RegInfo.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 -- 2.34.1