diff --git a/lib/CodeGen/InstrSelection/InstrSelection.cpp b/lib/CodeGen/InstrSelection/InstrSelection.cpp index af02e57616d..b63144781dc 100644 --- a/lib/CodeGen/InstrSelection/InstrSelection.cpp +++ b/lib/CodeGen/InstrSelection/InstrSelection.cpp @@ -31,9 +31,6 @@ using std::cerr; //******************** Internal Data Declarations ************************/ -// Use a static vector to avoid allocating a new one per VM instruction -static MachineInstr* minstrVec[MAX_INSTR_PER_VMINSTR]; - enum SelectDebugLevel_t { Select_NoDebugInfo, @@ -87,6 +84,11 @@ SelectInstructionsForMethod(Method* method, TargetMachine &target) if (SelectDebugLevel >= Select_DebugInstTrees) { + cerr << "\n\n*** Input to instruction selection for method " + << (method->hasName()? method->getName() : "") + << "\n\n"; + method->dump(); + cerr << "\n\n*** Instruction trees for method " << (method->hasName()? method->getName() : "") << "\n\n"; @@ -157,85 +159,40 @@ SelectInstructionsForMethod(Method* method, TargetMachine &target) // of phi elimination. //------------------------------------------------------------------------- -void InsertPhiElimInst(BasicBlock *BB, MachineInstr *CpMI) { - +void +InsertPhiElimInstructions(BasicBlock *BB, const vector& CpVec) +{ Instruction *TermInst = (Instruction*)BB->getTerminator(); MachineCodeForInstruction &MC4Term = MachineCodeForInstruction::get(TermInst); MachineInstr *FirstMIOfTerm = *( MC4Term.begin() ); - + assert( FirstMIOfTerm && "No Machine Instrs for terminator" ); - + // get an iterator to machine instructions in the BB MachineCodeForBasicBlock& bbMvec = BB->getMachineInstrVec(); MachineCodeForBasicBlock::iterator MCIt = bbMvec.begin(); - + // find the position of first machine instruction generated by the // terminator of this BB - for( ; (MCIt != bbMvec.end()) && (*MCIt != FirstMIOfTerm) ; ++MCIt ) ; - + for( ; (MCIt != bbMvec.end()) && (*MCIt != FirstMIOfTerm) ; ++MCIt ) + ; assert( MCIt != bbMvec.end() && "Start inst of terminator not found"); - - // insert the copy instruction just before the first machine instruction + + // insert the copy instructions just before the first machine instruction // generated for the terminator - bbMvec.insert( MCIt , CpMI ); - + bbMvec.insert(MCIt, CpVec.begin(), CpVec.end()); + //cerr << "\nPhiElimination copy inst: " << *CopyInstVec[0]; - } -#if 0 -//------------------------------------------------------------------------- -// This method inserts phi elimination code for all BBs in a method -//------------------------------------------------------------------------- -void InsertCode4AllPhisInMeth(Method *method, TargetMachine &target) { - - - // for all basic blocks in method - // - for (Method::iterator BI = method->begin(); BI != method->end(); ++BI) { - - BasicBlock *BB = *BI; - const BasicBlock::InstListType &InstList = BB->getInstList(); - BasicBlock::InstListType::const_iterator IIt = InstList.begin(); - - // for all instructions in the basic block - // - for( ; IIt != InstList.end(); ++IIt ) { - - if( (*IIt)->getOpcode() == Instruction::PHINode ) { - - PHINode *PN = (PHINode *) (*IIt); - - // for each incoming value of the phi, insert phi elimination - // - for (unsigned i = 0; i < PN->getNumIncomingValues(); ++i) { - - // insert the copy instruction to the predecessor BB - - std::vector CopyInstVec; - - MachineInstr *CpMI = - target.getRegInfo().cpValue2Value(PN->getIncomingValue(i), PN); - - InsertPhiElimInst( PN->getIncomingBlock(i), CpMI); - } - } - else break; // since PHI nodes can only be at the top - - } // for each Phi Instr in BB - - } // for all BBs in method - -} -#endif - //------------------------------------------------------------------------- // This method inserts phi elimination code for all BBs in a method //------------------------------------------------------------------------- -void InsertCode4AllPhisInMeth(Method *method, TargetMachine &target) { - +void +InsertCode4AllPhisInMeth(Method *method, TargetMachine &target) +{ // for all basic blocks in method // for (Method::iterator BI = method->begin(); BI != method->end(); ++BI) { @@ -261,10 +218,13 @@ void InsertCode4AllPhisInMeth(Method *method, TargetMachine &target) { MachineInstr *CpMI = target.getRegInfo().cpValue2Value(PN->getIncomingValue(i), PhiCpRes); - - InsertPhiElimInst(PN->getIncomingBlock(i), CpMI); + + vector CpVec = FixConstantOperandsForInstr(PN, CpMI, target); + CpVec.push_back(CpMI); + + InsertPhiElimInstructions(PN->getIncomingBlock(i), CpVec); } - + MachineInstr *CpMI2 = target.getRegInfo().cpValue2Value(PhiCpRes, PN); @@ -352,15 +312,16 @@ SelectInstructionsForTree(InstrTreeNode* treeRoot, int goalnt, // if (treeRoot->opLabel != VRegListOp) { + vector minstrVec; + InstructionNode* instrNode = (InstructionNode*)treeRoot; assert(instrNode->getNodeType() == InstrTreeNode::NTInstructionNode); - unsigned N = GetInstructionsByRule(instrNode, ruleForNode, nts, target, - minstrVec); - assert(N <= MAX_INSTR_PER_VMINSTR); + GetInstructionsByRule(instrNode, ruleForNode, nts, target, minstrVec); + MachineCodeForInstruction &mvec = MachineCodeForInstruction::get(instrNode->getInstruction()); - mvec.insert(mvec.end(), minstrVec, minstrVec+N); + mvec.insert(mvec.end(), minstrVec.begin(), minstrVec.end()); } // Then, recursively compile the child nodes, if any. diff --git a/lib/Target/SparcV9/InstrSelection/InstrSelection.cpp b/lib/Target/SparcV9/InstrSelection/InstrSelection.cpp index af02e57616d..b63144781dc 100644 --- a/lib/Target/SparcV9/InstrSelection/InstrSelection.cpp +++ b/lib/Target/SparcV9/InstrSelection/InstrSelection.cpp @@ -31,9 +31,6 @@ using std::cerr; //******************** Internal Data Declarations ************************/ -// Use a static vector to avoid allocating a new one per VM instruction -static MachineInstr* minstrVec[MAX_INSTR_PER_VMINSTR]; - enum SelectDebugLevel_t { Select_NoDebugInfo, @@ -87,6 +84,11 @@ SelectInstructionsForMethod(Method* method, TargetMachine &target) if (SelectDebugLevel >= Select_DebugInstTrees) { + cerr << "\n\n*** Input to instruction selection for method " + << (method->hasName()? method->getName() : "") + << "\n\n"; + method->dump(); + cerr << "\n\n*** Instruction trees for method " << (method->hasName()? method->getName() : "") << "\n\n"; @@ -157,85 +159,40 @@ SelectInstructionsForMethod(Method* method, TargetMachine &target) // of phi elimination. //------------------------------------------------------------------------- -void InsertPhiElimInst(BasicBlock *BB, MachineInstr *CpMI) { - +void +InsertPhiElimInstructions(BasicBlock *BB, const vector& CpVec) +{ Instruction *TermInst = (Instruction*)BB->getTerminator(); MachineCodeForInstruction &MC4Term = MachineCodeForInstruction::get(TermInst); MachineInstr *FirstMIOfTerm = *( MC4Term.begin() ); - + assert( FirstMIOfTerm && "No Machine Instrs for terminator" ); - + // get an iterator to machine instructions in the BB MachineCodeForBasicBlock& bbMvec = BB->getMachineInstrVec(); MachineCodeForBasicBlock::iterator MCIt = bbMvec.begin(); - + // find the position of first machine instruction generated by the // terminator of this BB - for( ; (MCIt != bbMvec.end()) && (*MCIt != FirstMIOfTerm) ; ++MCIt ) ; - + for( ; (MCIt != bbMvec.end()) && (*MCIt != FirstMIOfTerm) ; ++MCIt ) + ; assert( MCIt != bbMvec.end() && "Start inst of terminator not found"); - - // insert the copy instruction just before the first machine instruction + + // insert the copy instructions just before the first machine instruction // generated for the terminator - bbMvec.insert( MCIt , CpMI ); - + bbMvec.insert(MCIt, CpVec.begin(), CpVec.end()); + //cerr << "\nPhiElimination copy inst: " << *CopyInstVec[0]; - } -#if 0 -//------------------------------------------------------------------------- -// This method inserts phi elimination code for all BBs in a method -//------------------------------------------------------------------------- -void InsertCode4AllPhisInMeth(Method *method, TargetMachine &target) { - - - // for all basic blocks in method - // - for (Method::iterator BI = method->begin(); BI != method->end(); ++BI) { - - BasicBlock *BB = *BI; - const BasicBlock::InstListType &InstList = BB->getInstList(); - BasicBlock::InstListType::const_iterator IIt = InstList.begin(); - - // for all instructions in the basic block - // - for( ; IIt != InstList.end(); ++IIt ) { - - if( (*IIt)->getOpcode() == Instruction::PHINode ) { - - PHINode *PN = (PHINode *) (*IIt); - - // for each incoming value of the phi, insert phi elimination - // - for (unsigned i = 0; i < PN->getNumIncomingValues(); ++i) { - - // insert the copy instruction to the predecessor BB - - std::vector CopyInstVec; - - MachineInstr *CpMI = - target.getRegInfo().cpValue2Value(PN->getIncomingValue(i), PN); - - InsertPhiElimInst( PN->getIncomingBlock(i), CpMI); - } - } - else break; // since PHI nodes can only be at the top - - } // for each Phi Instr in BB - - } // for all BBs in method - -} -#endif - //------------------------------------------------------------------------- // This method inserts phi elimination code for all BBs in a method //------------------------------------------------------------------------- -void InsertCode4AllPhisInMeth(Method *method, TargetMachine &target) { - +void +InsertCode4AllPhisInMeth(Method *method, TargetMachine &target) +{ // for all basic blocks in method // for (Method::iterator BI = method->begin(); BI != method->end(); ++BI) { @@ -261,10 +218,13 @@ void InsertCode4AllPhisInMeth(Method *method, TargetMachine &target) { MachineInstr *CpMI = target.getRegInfo().cpValue2Value(PN->getIncomingValue(i), PhiCpRes); - - InsertPhiElimInst(PN->getIncomingBlock(i), CpMI); + + vector CpVec = FixConstantOperandsForInstr(PN, CpMI, target); + CpVec.push_back(CpMI); + + InsertPhiElimInstructions(PN->getIncomingBlock(i), CpVec); } - + MachineInstr *CpMI2 = target.getRegInfo().cpValue2Value(PhiCpRes, PN); @@ -352,15 +312,16 @@ SelectInstructionsForTree(InstrTreeNode* treeRoot, int goalnt, // if (treeRoot->opLabel != VRegListOp) { + vector minstrVec; + InstructionNode* instrNode = (InstructionNode*)treeRoot; assert(instrNode->getNodeType() == InstrTreeNode::NTInstructionNode); - unsigned N = GetInstructionsByRule(instrNode, ruleForNode, nts, target, - minstrVec); - assert(N <= MAX_INSTR_PER_VMINSTR); + GetInstructionsByRule(instrNode, ruleForNode, nts, target, minstrVec); + MachineCodeForInstruction &mvec = MachineCodeForInstruction::get(instrNode->getInstruction()); - mvec.insert(mvec.end(), minstrVec, minstrVec+N); + mvec.insert(mvec.end(), minstrVec.begin(), minstrVec.end()); } // Then, recursively compile the child nodes, if any.