X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=lib%2FTarget%2FSparcV9%2FInstrSelection%2FInstrSelection.cpp;h=32dc65e6e1e9196e0b558d4984784c789b463bba;hp=294ecc681338983283f0cddf2ea6206163c0487c;hb=b576c94c15af9a440f69d9d03c2afead7971118c;hpb=d0f166a4868c957041fa0ca0a35adde97aa10c91 diff --git a/lib/Target/SparcV9/InstrSelection/InstrSelection.cpp b/lib/Target/SparcV9/InstrSelection/InstrSelection.cpp index 294ecc68133..32dc65e6e1e 100644 --- a/lib/Target/SparcV9/InstrSelection/InstrSelection.cpp +++ b/lib/Target/SparcV9/InstrSelection/InstrSelection.cpp @@ -1,4 +1,11 @@ -//===- InstrSelection.cpp - Machine Independant Inst Selection Driver -----===// +//===- InstrSelection.cpp - Machine Independent Inst Selection Driver -----===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// // // Machine-independent driver file for instruction selection. This file // constructs a forest of BURG instruction trees and then uses the @@ -19,9 +26,12 @@ #include "llvm/Pass.h" #include "Support/CommandLine.h" #include "Support/LeakDetector.h" -using std::cerr; using std::vector; +std::vector +FixConstantOperandsForInstr(Instruction* vmInstr, MachineInstr* minstr, + TargetMachine& target); + namespace { //===--------------------------------------------------------------------===// // SelectDebugLevel - Allow command line control over debugging. @@ -68,16 +78,17 @@ namespace { } bool runOnFunction(Function &F); + virtual const char *getPassName() const { return "Instruction Selection"; } }; } -// Register the pass... -static RegisterLLC -X("instselect", "Instruction Selection", createInstructionSelectionPass); +TmpInstruction::TmpInstruction(MachineCodeForInstruction& mcfi, + Value *s1, Value *s2, const std::string &name) + : Instruction(s1->getType(), Instruction::UserOp1, name) +{ + mcfi.addTemp(this); -TmpInstruction::TmpInstruction(Value *s1, Value *s2, const std::string &name) - : Instruction(s1->getType(), Instruction::UserOp1, name) { - Operands.push_back(Use(s1, this)); // s1 must be nonnull + Operands.push_back(Use(s1, this)); // s1 must be non-null if (s2) { Operands.push_back(Use(s2, this)); } @@ -88,9 +99,13 @@ TmpInstruction::TmpInstruction(Value *s1, Value *s2, const std::string &name) // Constructor that requires the type of the temporary to be specified. // 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) - : Instruction(Ty, Instruction::UserOp1, name) { + : Instruction(Ty, Instruction::UserOp1, name) +{ + mcfi.addTemp(this); + if (s1) { Operands.push_back(Use(s1, this)); } if (s2) { Operands.push_back(Use(s2, this)); } @@ -108,10 +123,10 @@ bool InstructionSelection::runOnFunction(Function &F) if (SelectDebugLevel >= Select_DebugInstTrees) { - cerr << "\n\n*** Input to instruction selection for function " - << F.getName() << "\n\n" << F - << "\n\n*** Instruction trees for function " - << F.getName() << "\n\n"; + std::cerr << "\n\n*** Input to instruction selection for function " + << F.getName() << "\n\n" << F + << "\n\n*** Instruction trees for function " + << F.getName() << "\n\n"; instrForest.dump(); } @@ -130,7 +145,7 @@ bool InstructionSelection::runOnFunction(Function &F) if (SelectDebugLevel >= Select_DebugBurgTrees) { printcover(basicNode, 1, 0); - cerr << "\nCover cost == " << treecost(basicNode, 1, 0) << "\n\n"; + std::cerr << "\nCover cost == " << treecost(basicNode, 1, 0) <<"\n\n"; printMatches(basicNode); } @@ -159,7 +174,7 @@ bool InstructionSelection::runOnFunction(Function &F) if (SelectDebugLevel >= Select_PrintMachineCode) { - cerr << "\n*** Machine instructions after INSTRUCTION SELECTION\n"; + std::cerr << "\n*** Machine instructions after INSTRUCTION SELECTION\n"; MachineFunction::get(&F).dump(); } @@ -178,8 +193,8 @@ InstructionSelection::InsertCodeForPhis(Function &F) // MachineFunction &MF = MachineFunction::get(&F); for (MachineFunction::iterator BB = MF.begin(); BB != MF.end(); ++BB) { - for (BasicBlock::iterator IIt = BB->getBasicBlock()->begin(); - PHINode *PN = dyn_cast(&*IIt); ++IIt) { + for (BasicBlock::const_iterator IIt = BB->getBasicBlock()->begin(); + const PHINode *PN = dyn_cast(IIt); ++IIt) { // FIXME: This is probably wrong... Value *PhiCpRes = new PHINode(PN->getType(), "PhiCp:"); @@ -198,7 +213,7 @@ InstructionSelection::InsertCodeForPhis(Function &F) for (vector::iterator MI=mvec.begin(); MI != mvec.end(); ++MI) { vector CpVec2 = - FixConstantOperandsForInstr(PN, *MI, Target); + FixConstantOperandsForInstr(const_cast(PN), *MI, Target); CpVec2.push_back(*MI); CpVec.insert(CpVec.end(), CpVec2.begin(), CpVec2.end()); } @@ -207,7 +222,8 @@ InstructionSelection::InsertCodeForPhis(Function &F) } vector mvec; - Target.getRegInfo().cpValue2Value(PhiCpRes, PN, mvec); + Target.getRegInfo().cpValue2Value(PhiCpRes, const_cast(PN), + mvec); BB->insert(BB->begin(), mvec.begin(), mvec.end()); } // for each Phi Instr in BB } // for all BBs in function @@ -230,7 +246,7 @@ InstructionSelection::InsertPhiElimInstructions(BasicBlock *BB, MachineFunction &MF = MachineFunction::get(BB->getParent()); // FIXME: if PHI instructions existed in the machine code, this would be - // unnecesary. + // unnecessary. MachineBasicBlock *MBB = 0; for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) if (I->getBasicBlock() == BB) { @@ -276,7 +292,7 @@ InstructionSelection::SelectInstructionsForTree(InstrTreeNode* treeRoot, int ruleForNode = burm_rule(treeRoot->state, goalnt); if (ruleForNode == 0) { - cerr << "Could not match instruction tree for instr selection\n"; + std::cerr << "Could not match instruction tree for instr selection\n"; abort(); } @@ -333,7 +349,7 @@ InstructionSelection::SelectInstructionsForTree(InstrTreeNode* treeRoot, } } - // Finally, do any postprocessing on this node after its children + // Finally, do any post-processing on this node after its children // have been translated // if (treeRoot->opLabel != VRegListOp) @@ -372,7 +388,6 @@ InstructionSelection::PostprocessMachineCodeForTree(InstructionNode* instrNode, // createInstructionSelectionPass - Public entrypoint for instruction selection // and this file as a whole... // -Pass *createInstructionSelectionPass(TargetMachine &T) { +FunctionPass *createInstructionSelectionPass(TargetMachine &T) { return new InstructionSelection(T); } -