Loading llvm/lib/Transforms/Utils/CodeExtractor.cpp +12 −3 Original line number Diff line number Diff line Loading @@ -622,7 +622,7 @@ ExtractCodeRegion(const std::vector<BasicBlock*> &code) { Function *oldFunction = header->getParent(); // This takes place of the original loop BasicBlock *codeReplacer = new BasicBlock("codeRepl", oldFunction); BasicBlock *codeReplacer = new BasicBlock("codeRepl", oldFunction, header); // The new function needs a root node because other nodes can branch to the // head of the region, but the entry node of a function cannot have preds. Loading Loading @@ -657,10 +657,19 @@ ExtractCodeRegion(const std::vector<BasicBlock*> &code) { succ_end(codeReplacer)); for (unsigned i = 0, e = Succs.size(); i != e; ++i) for (BasicBlock::iterator I = Succs[i]->begin(); PHINode *PN = dyn_cast<PHINode>(I); ++I) PHINode *PN = dyn_cast<PHINode>(I); ++I) { std::set<BasicBlock*> ProcessedPreds; for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) if (BlocksToExtract.count(PN->getIncomingBlock(i))) if (ProcessedPreds.insert(PN->getIncomingBlock(i)).second) PN->setIncomingBlock(i, codeReplacer); else { // There were multiple entries in the PHI for this block, now there // is only one, so remove the duplicated entries. PN->removeIncomingValue(i, false); --i; --e; } } //std::cerr << "NEW FUNCTION: " << *newFunction; // verifyFunction(*newFunction); Loading llvm/lib/Transforms/Utils/ValueMapper.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,11 @@ Value *llvm::MapValue(const Value *V, std::map<const Value*, Value*> &VM) { for (unsigned i = 1, e = CE->getNumOperands(); i != e; ++i) Idx.push_back(cast<Constant>(MapValue(CE->getOperand(i), VM))); return VMSlot = ConstantExpr::getGetElementPtr(MV, Idx); } else if (CE->getOpcode() == Instruction::Select) { Constant *MV1 = cast<Constant>(MapValue(CE->getOperand(0), VM)); Constant *MV2 = cast<Constant>(MapValue(CE->getOperand(1), VM)); Constant *MV3 = cast<Constant>(MapValue(CE->getOperand(2), VM)); return VMSlot = ConstantExpr::getSelect(MV1, MV2, MV3); } else { assert(CE->getNumOperands() == 2 && "Must be binary operator?"); Constant *MV1 = cast<Constant>(MapValue(CE->getOperand(0), VM)); Loading Loading
llvm/lib/Transforms/Utils/CodeExtractor.cpp +12 −3 Original line number Diff line number Diff line Loading @@ -622,7 +622,7 @@ ExtractCodeRegion(const std::vector<BasicBlock*> &code) { Function *oldFunction = header->getParent(); // This takes place of the original loop BasicBlock *codeReplacer = new BasicBlock("codeRepl", oldFunction); BasicBlock *codeReplacer = new BasicBlock("codeRepl", oldFunction, header); // The new function needs a root node because other nodes can branch to the // head of the region, but the entry node of a function cannot have preds. Loading Loading @@ -657,10 +657,19 @@ ExtractCodeRegion(const std::vector<BasicBlock*> &code) { succ_end(codeReplacer)); for (unsigned i = 0, e = Succs.size(); i != e; ++i) for (BasicBlock::iterator I = Succs[i]->begin(); PHINode *PN = dyn_cast<PHINode>(I); ++I) PHINode *PN = dyn_cast<PHINode>(I); ++I) { std::set<BasicBlock*> ProcessedPreds; for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) if (BlocksToExtract.count(PN->getIncomingBlock(i))) if (ProcessedPreds.insert(PN->getIncomingBlock(i)).second) PN->setIncomingBlock(i, codeReplacer); else { // There were multiple entries in the PHI for this block, now there // is only one, so remove the duplicated entries. PN->removeIncomingValue(i, false); --i; --e; } } //std::cerr << "NEW FUNCTION: " << *newFunction; // verifyFunction(*newFunction); Loading
llvm/lib/Transforms/Utils/ValueMapper.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,11 @@ Value *llvm::MapValue(const Value *V, std::map<const Value*, Value*> &VM) { for (unsigned i = 1, e = CE->getNumOperands(); i != e; ++i) Idx.push_back(cast<Constant>(MapValue(CE->getOperand(i), VM))); return VMSlot = ConstantExpr::getGetElementPtr(MV, Idx); } else if (CE->getOpcode() == Instruction::Select) { Constant *MV1 = cast<Constant>(MapValue(CE->getOperand(0), VM)); Constant *MV2 = cast<Constant>(MapValue(CE->getOperand(1), VM)); Constant *MV3 = cast<Constant>(MapValue(CE->getOperand(2), VM)); return VMSlot = ConstantExpr::getSelect(MV1, MV2, MV3); } else { assert(CE->getNumOperands() == 2 && "Must be binary operator?"); Constant *MV1 = cast<Constant>(MapValue(CE->getOperand(0), VM)); Loading