Added MachineCodeForInstruction object as an argument to

TmpInstruction constructors because every TmpInstruction object has
to be registered with a MachineCodeForInstruction to prevent leaks.
This simplifies the user's code.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6469 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Vikram S. Adve
2003-05-31 07:41:24 +00:00
parent 3497782f38
commit f3d3ca18b5
5 changed files with 35 additions and 15 deletions

View File

@@ -13,6 +13,7 @@ class InstrForest;
class MachineInstr; class MachineInstr;
class InstructionNode; class InstructionNode;
class TargetMachine; class TargetMachine;
class MachineCodeForInstruction;
class Pass; class Pass;
//===--------------------- Required Functions --------------------------------- //===--------------------- Required Functions ---------------------------------
@@ -68,14 +69,19 @@ class TmpInstruction : public Instruction {
public: public:
// Constructor that uses the type of S1 as the type of the temporary. // Constructor that uses the type of S1 as the type of the temporary.
// s1 must be a valid value. s2 may be NULL. // s1 must be a valid value. s2 may be NULL.
TmpInstruction(Value *s1, Value *s2 = 0, const std::string &name = ""); TmpInstruction(MachineCodeForInstruction& mcfi,
Value *s1, Value *s2 = 0, const std::string &name = "");
// Constructor that requires the type of the temporary to be specified. // Constructor that requires the type of the temporary to be specified.
// Both S1 and S2 may be NULL. // Both S1 and S2 may be NULL.
TmpInstruction(const Type *Ty, Value *s1 = 0, Value* s2 = 0, TmpInstruction(MachineCodeForInstruction& mcfi,
const Type *Ty, Value *s1 = 0, Value* s2 = 0,
const std::string &name = ""); const std::string &name = "");
virtual Instruction *clone() const { return new TmpInstruction(*this); } virtual Instruction *clone() const {
assert(0 && "Cannot clone TmpInstructions!");
return 0;
}
virtual const char *getOpcodeName() const { virtual const char *getOpcodeName() const {
return "TempValueForMachineInstr"; return "TempValueForMachineInstr";
} }

View File

@@ -78,8 +78,12 @@ namespace {
static RegisterLLC<InstructionSelection> static RegisterLLC<InstructionSelection>
X("instselect", "Instruction Selection", createInstructionSelectionPass); X("instselect", "Instruction Selection", createInstructionSelectionPass);
TmpInstruction::TmpInstruction(Value *s1, Value *s2, const std::string &name) TmpInstruction::TmpInstruction(MachineCodeForInstruction& mcfi,
: Instruction(s1->getType(), Instruction::UserOp1, name) { Value *s1, Value *s2, const std::string &name)
: Instruction(s1->getType(), Instruction::UserOp1, name)
{
mcfi.addTemp(this);
Operands.push_back(Use(s1, this)); // s1 must be nonnull Operands.push_back(Use(s1, this)); // s1 must be nonnull
if (s2) { if (s2) {
Operands.push_back(Use(s2, this)); Operands.push_back(Use(s2, this));
@@ -91,9 +95,13 @@ TmpInstruction::TmpInstruction(Value *s1, Value *s2, const std::string &name)
// Constructor that requires the type of the temporary to be specified. // Constructor that requires the type of the temporary to be specified.
// Both S1 and S2 may be NULL.( // Both S1 and S2 may be NULL.(
TmpInstruction::TmpInstruction(const Type *Ty, Value *s1, Value* s2, TmpInstruction::TmpInstruction(MachineCodeForInstruction& mcfi,
const Type *Ty, Value *s1, Value* s2,
const std::string &name) const std::string &name)
: Instruction(Ty, Instruction::UserOp1, name) { : Instruction(Ty, Instruction::UserOp1, name)
{
mcfi.addTemp(this);
if (s1) { Operands.push_back(Use(s1, this)); } if (s1) { Operands.push_back(Use(s1, this)); }
if (s2) { Operands.push_back(Use(s2, this)); } if (s2) { Operands.push_back(Use(s2, this)); }

View File

@@ -33,9 +33,8 @@ InsertCodeToLoadConstant(Function *F,
TargetMachine& target) TargetMachine& target)
{ {
// Create a tmp virtual register to hold the constant. // Create a tmp virtual register to hold the constant.
TmpInstruction* tmpReg = new TmpInstruction(opValue);
MachineCodeForInstruction &mcfi = MachineCodeForInstruction::get(vmInstr); MachineCodeForInstruction &mcfi = MachineCodeForInstruction::get(vmInstr);
mcfi.addTemp(tmpReg); TmpInstruction* tmpReg = new TmpInstruction(mcfi, opValue);
target.getInstrInfo().CreateCodeToLoadConst(target, F, opValue, tmpReg, target.getInstrInfo().CreateCodeToLoadConst(target, F, opValue, tmpReg,
loadConstVec, mcfi); loadConstVec, mcfi);

View File

@@ -78,8 +78,12 @@ namespace {
static RegisterLLC<InstructionSelection> static RegisterLLC<InstructionSelection>
X("instselect", "Instruction Selection", createInstructionSelectionPass); X("instselect", "Instruction Selection", createInstructionSelectionPass);
TmpInstruction::TmpInstruction(Value *s1, Value *s2, const std::string &name) TmpInstruction::TmpInstruction(MachineCodeForInstruction& mcfi,
: Instruction(s1->getType(), Instruction::UserOp1, name) { Value *s1, Value *s2, const std::string &name)
: Instruction(s1->getType(), Instruction::UserOp1, name)
{
mcfi.addTemp(this);
Operands.push_back(Use(s1, this)); // s1 must be nonnull Operands.push_back(Use(s1, this)); // s1 must be nonnull
if (s2) { if (s2) {
Operands.push_back(Use(s2, this)); Operands.push_back(Use(s2, this));
@@ -91,9 +95,13 @@ TmpInstruction::TmpInstruction(Value *s1, Value *s2, const std::string &name)
// Constructor that requires the type of the temporary to be specified. // Constructor that requires the type of the temporary to be specified.
// Both S1 and S2 may be NULL.( // Both S1 and S2 may be NULL.(
TmpInstruction::TmpInstruction(const Type *Ty, Value *s1, Value* s2, TmpInstruction::TmpInstruction(MachineCodeForInstruction& mcfi,
const Type *Ty, Value *s1, Value* s2,
const std::string &name) const std::string &name)
: Instruction(Ty, Instruction::UserOp1, name) { : Instruction(Ty, Instruction::UserOp1, name)
{
mcfi.addTemp(this);
if (s1) { Operands.push_back(Use(s1, this)); } if (s1) { Operands.push_back(Use(s1, this)); }
if (s2) { Operands.push_back(Use(s2, this)); } if (s2) { Operands.push_back(Use(s2, this)); }

View File

@@ -33,9 +33,8 @@ InsertCodeToLoadConstant(Function *F,
TargetMachine& target) TargetMachine& target)
{ {
// Create a tmp virtual register to hold the constant. // Create a tmp virtual register to hold the constant.
TmpInstruction* tmpReg = new TmpInstruction(opValue);
MachineCodeForInstruction &mcfi = MachineCodeForInstruction::get(vmInstr); MachineCodeForInstruction &mcfi = MachineCodeForInstruction::get(vmInstr);
mcfi.addTemp(tmpReg); TmpInstruction* tmpReg = new TmpInstruction(mcfi, opValue);
target.getInstrInfo().CreateCodeToLoadConst(target, F, opValue, tmpReg, target.getInstrInfo().CreateCodeToLoadConst(target, F, opValue, tmpReg,
loadConstVec, mcfi); loadConstVec, mcfi);