From 94e40ef064deec984d25eaceaf684795627f2d5b Mon Sep 17 00:00:00 2001 From: "Vikram S. Adve" Date: Sun, 28 Oct 2001 21:46:23 +0000 Subject: [PATCH] Record constants that need to be emitted in the assembly code. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1010 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../InstrSelection/InstrSelectionSupport.cpp | 59 ++++++------------- .../InstrSelection/InstrSelectionSupport.cpp | 59 ++++++------------- 2 files changed, 38 insertions(+), 80 deletions(-) diff --git a/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp b/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp index 7fe91643a2f..400d5948d4f 100644 --- a/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp +++ b/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp @@ -17,6 +17,8 @@ #include "llvm/Target/TargetMachine.h" #include "llvm/Target/MachineRegInfo.h" #include "llvm/ConstPoolVals.h" +#include "llvm/Method.h" +#include "llvm/BasicBlock.h" #include "llvm/Instruction.h" #include "llvm/Type.h" #include "llvm/iMemory.h" @@ -299,6 +301,8 @@ FixConstantOperandsForInstr(Instruction* vmInstr, const MachineInstrDescriptor& instrDesc = target.getInstrInfo().getDescriptor(minstr->getOpCode()); + Method* method = vmInstr->getParent()->getParent(); + for (unsigned op=0; op < minstr->getNumOperands(); op++) { const MachineOperand& mop = minstr->getOperand(op); @@ -330,8 +334,14 @@ FixConstantOperandsForInstr(Instruction* vmInstr, constantThatMustBeLoaded = true; // load is generated below else minstr->SetMachineOperand(op, opType, immedValue); - } + if (constantThatMustBeLoaded) + { // register the value so it is emitted in the assembly + method->getMachineCode().addToConstantPool( + cast(opValue)); + } + } + if (constantThatMustBeLoaded || isa(opValue)) { // opValue is a constant that must be explicitly loaded into a reg. TmpInstruction* tmpReg = InsertCodeToLoadConstant(opValue, vmInstr, @@ -355,50 +365,19 @@ FixConstantOperandsForInstr(Instruction* vmInstr, if (isa(minstr->getImplicitRef(i)) || isa(minstr->getImplicitRef(i))) { + Value* oldVal = minstr->getImplicitRef(i); TmpInstruction* tmpReg = - InsertCodeToLoadConstant(minstr->getImplicitRef(i), vmInstr, - loadConstVec, target); + InsertCodeToLoadConstant(oldVal, vmInstr, loadConstVec, target); minstr->setImplicitRef(i, tmpReg); + + if (isa(oldVal)) + { // register the value so it is emitted in the assembly + method->getMachineCode().addToConstantPool( + cast(oldVal)); + } } return loadConstVec; } -#undef SAVE_TO_MOVE_BACK_TO_SPARCISSCPP -#ifdef SAVE_TO_MOVE_BACK_TO_SPARCISSCPP -unsigned -FixConstantOperands(const InstructionNode* vmInstrNode, - TargetMachine& target) -{ - Instruction* vmInstr = vmInstrNode->getInstruction(); - MachineCodeForVMInstr& mvec = vmInstr->getMachineInstrVec(); - - for (unsigned i=0; i < mvec.size(); i++) - { - vector loadConstVec = - FixConstantOperandsForInstr(mvec[i], target); - } - - // - // Finally, inserted the generated instructions in the vector - // to be returned. - // - unsigned numNew = loadConstVec.size(); - if (numNew > 0) - { - // Insert the new instructions *before* the old ones by moving - // the old ones over `numNew' positions (last-to-first, of course!). - // We do check *after* returning that we did not exceed the vector mvec. - for (int i=numInstr-1; i >= 0; i--) - mvec[i+numNew] = mvec[i]; - - for (unsigned i=0; i < numNew; i++) - mvec[i] = loadConstVec[i]; - } - - return (numInstr + numNew); -} -#endif SAVE_TO_MOVE_BACK_TO_SPARCISSCPP - - diff --git a/lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp b/lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp index 7fe91643a2f..400d5948d4f 100644 --- a/lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp +++ b/lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp @@ -17,6 +17,8 @@ #include "llvm/Target/TargetMachine.h" #include "llvm/Target/MachineRegInfo.h" #include "llvm/ConstPoolVals.h" +#include "llvm/Method.h" +#include "llvm/BasicBlock.h" #include "llvm/Instruction.h" #include "llvm/Type.h" #include "llvm/iMemory.h" @@ -299,6 +301,8 @@ FixConstantOperandsForInstr(Instruction* vmInstr, const MachineInstrDescriptor& instrDesc = target.getInstrInfo().getDescriptor(minstr->getOpCode()); + Method* method = vmInstr->getParent()->getParent(); + for (unsigned op=0; op < minstr->getNumOperands(); op++) { const MachineOperand& mop = minstr->getOperand(op); @@ -330,8 +334,14 @@ FixConstantOperandsForInstr(Instruction* vmInstr, constantThatMustBeLoaded = true; // load is generated below else minstr->SetMachineOperand(op, opType, immedValue); - } + if (constantThatMustBeLoaded) + { // register the value so it is emitted in the assembly + method->getMachineCode().addToConstantPool( + cast(opValue)); + } + } + if (constantThatMustBeLoaded || isa(opValue)) { // opValue is a constant that must be explicitly loaded into a reg. TmpInstruction* tmpReg = InsertCodeToLoadConstant(opValue, vmInstr, @@ -355,50 +365,19 @@ FixConstantOperandsForInstr(Instruction* vmInstr, if (isa(minstr->getImplicitRef(i)) || isa(minstr->getImplicitRef(i))) { + Value* oldVal = minstr->getImplicitRef(i); TmpInstruction* tmpReg = - InsertCodeToLoadConstant(minstr->getImplicitRef(i), vmInstr, - loadConstVec, target); + InsertCodeToLoadConstant(oldVal, vmInstr, loadConstVec, target); minstr->setImplicitRef(i, tmpReg); + + if (isa(oldVal)) + { // register the value so it is emitted in the assembly + method->getMachineCode().addToConstantPool( + cast(oldVal)); + } } return loadConstVec; } -#undef SAVE_TO_MOVE_BACK_TO_SPARCISSCPP -#ifdef SAVE_TO_MOVE_BACK_TO_SPARCISSCPP -unsigned -FixConstantOperands(const InstructionNode* vmInstrNode, - TargetMachine& target) -{ - Instruction* vmInstr = vmInstrNode->getInstruction(); - MachineCodeForVMInstr& mvec = vmInstr->getMachineInstrVec(); - - for (unsigned i=0; i < mvec.size(); i++) - { - vector loadConstVec = - FixConstantOperandsForInstr(mvec[i], target); - } - - // - // Finally, inserted the generated instructions in the vector - // to be returned. - // - unsigned numNew = loadConstVec.size(); - if (numNew > 0) - { - // Insert the new instructions *before* the old ones by moving - // the old ones over `numNew' positions (last-to-first, of course!). - // We do check *after* returning that we did not exceed the vector mvec. - for (int i=numInstr-1; i >= 0; i--) - mvec[i+numNew] = mvec[i]; - - for (unsigned i=0; i < numNew; i++) - mvec[i] = loadConstVec[i]; - } - - return (numInstr + numNew); -} -#endif SAVE_TO_MOVE_BACK_TO_SPARCISSCPP - -