diff --git a/lib/CodeGen/InstrSelection/InstrSelection.cpp b/lib/CodeGen/InstrSelection/InstrSelection.cpp index 677bef7d04a..a2e9bb642e4 100644 --- a/lib/CodeGen/InstrSelection/InstrSelection.cpp +++ b/lib/CodeGen/InstrSelection/InstrSelection.cpp @@ -176,9 +176,9 @@ InstructionSelection::InsertCodeForPhis(Function &F) { // for all basic blocks in function // - for (Function::iterator BB = F.begin(); BB != F.end(); ++BB) { - BasicBlock::InstListType &InstList = BB->getInstList(); - for (BasicBlock::iterator IIt = InstList.begin(); + 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) { // FIXME: This is probably wrong... Value *PhiCpRes = new PHINode(PN->getType(), "PhiCp:"); @@ -208,11 +208,7 @@ InstructionSelection::InsertCodeForPhis(Function &F) vector mvec; Target.getRegInfo().cpValue2Value(PhiCpRes, PN, mvec); - - // get an iterator to machine instructions in the BB - MachineBasicBlock& bbMvec = MachineBasicBlock::get(BB); - - bbMvec.insert(bbMvec.begin(), mvec.begin(), mvec.end()); + BB->insert(BB->begin(), mvec.begin(), mvec.end()); } // for each Phi Instr in BB } // for all BBs in function } @@ -229,21 +225,29 @@ InstructionSelection::InsertPhiElimInstructions(BasicBlock *BB, Instruction *TermInst = (Instruction*)BB->getTerminator(); MachineCodeForInstruction &MC4Term = MachineCodeForInstruction::get(TermInst); MachineInstr *FirstMIOfTerm = MC4Term.front(); - assert (FirstMIOfTerm && "No Machine Instrs for terminator"); - - MachineBasicBlock &bbMvec = MachineBasicBlock::get(BB); + + MachineFunction &MF = MachineFunction::get(BB->getParent()); + MachineBasicBlock *MBB; + + // FIXME: if PHI instructions existed in the machine code, this would be + // unnecesary. + for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) + if (I->getBasicBlock() == BB) { + MBB = I; + break; + } // find the position of first machine instruction generated by the // terminator of this BB MachineBasicBlock::iterator MCIt = - std::find(bbMvec.begin(), bbMvec.end(), FirstMIOfTerm); + std::find(MBB->begin(), MBB->end(), FirstMIOfTerm); - assert( MCIt != bbMvec.end() && "Start inst of terminator not found"); + assert(MCIt != MBB->end() && "Start inst of terminator not found"); // insert the copy instructions just before the first machine instruction // generated for the terminator - bbMvec.insert(MCIt, CpVec.begin(), CpVec.end()); + MBB->insert(MCIt, CpVec.begin(), CpVec.end()); } diff --git a/lib/Target/SparcV9/InstrSelection/InstrSelection.cpp b/lib/Target/SparcV9/InstrSelection/InstrSelection.cpp index 677bef7d04a..a2e9bb642e4 100644 --- a/lib/Target/SparcV9/InstrSelection/InstrSelection.cpp +++ b/lib/Target/SparcV9/InstrSelection/InstrSelection.cpp @@ -176,9 +176,9 @@ InstructionSelection::InsertCodeForPhis(Function &F) { // for all basic blocks in function // - for (Function::iterator BB = F.begin(); BB != F.end(); ++BB) { - BasicBlock::InstListType &InstList = BB->getInstList(); - for (BasicBlock::iterator IIt = InstList.begin(); + 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) { // FIXME: This is probably wrong... Value *PhiCpRes = new PHINode(PN->getType(), "PhiCp:"); @@ -208,11 +208,7 @@ InstructionSelection::InsertCodeForPhis(Function &F) vector mvec; Target.getRegInfo().cpValue2Value(PhiCpRes, PN, mvec); - - // get an iterator to machine instructions in the BB - MachineBasicBlock& bbMvec = MachineBasicBlock::get(BB); - - bbMvec.insert(bbMvec.begin(), mvec.begin(), mvec.end()); + BB->insert(BB->begin(), mvec.begin(), mvec.end()); } // for each Phi Instr in BB } // for all BBs in function } @@ -229,21 +225,29 @@ InstructionSelection::InsertPhiElimInstructions(BasicBlock *BB, Instruction *TermInst = (Instruction*)BB->getTerminator(); MachineCodeForInstruction &MC4Term = MachineCodeForInstruction::get(TermInst); MachineInstr *FirstMIOfTerm = MC4Term.front(); - assert (FirstMIOfTerm && "No Machine Instrs for terminator"); - - MachineBasicBlock &bbMvec = MachineBasicBlock::get(BB); + + MachineFunction &MF = MachineFunction::get(BB->getParent()); + MachineBasicBlock *MBB; + + // FIXME: if PHI instructions existed in the machine code, this would be + // unnecesary. + for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) + if (I->getBasicBlock() == BB) { + MBB = I; + break; + } // find the position of first machine instruction generated by the // terminator of this BB MachineBasicBlock::iterator MCIt = - std::find(bbMvec.begin(), bbMvec.end(), FirstMIOfTerm); + std::find(MBB->begin(), MBB->end(), FirstMIOfTerm); - assert( MCIt != bbMvec.end() && "Start inst of terminator not found"); + assert(MCIt != MBB->end() && "Start inst of terminator not found"); // insert the copy instructions just before the first machine instruction // generated for the terminator - bbMvec.insert(MCIt, CpVec.begin(), CpVec.end()); + MBB->insert(MCIt, CpVec.begin(), CpVec.end()); }