Added IRBuilder::SetInsertPoint(Use) to find a valid insertion point
that dominates the given Use. llvm-svn: 134111
This commit is contained in:
parent
f0f9f45087
commit
e98e9a1540
|
|
@ -90,6 +90,19 @@ public:
|
|||
InsertPt = IP;
|
||||
}
|
||||
|
||||
/// SetInsertPoint(Use) - Find the nearest point that dominates this use, and
|
||||
/// specify that created instructions should be inserted at this point.
|
||||
void SetInsertPoint(Use &U) {
|
||||
Instruction *UseInst = cast<Instruction>(U.getUser());
|
||||
if (PHINode *Phi = dyn_cast<PHINode>(UseInst)) {
|
||||
BasicBlock *PredBB = Phi->getIncomingBlock(U);
|
||||
assert(U != PredBB->getTerminator() && "critical edge not split");
|
||||
SetInsertPoint(PredBB, PredBB->getTerminator());
|
||||
return;
|
||||
}
|
||||
SetInsertPoint(UseInst);
|
||||
}
|
||||
|
||||
/// SetCurrentDebugLocation - Set location information used by debugging
|
||||
/// information.
|
||||
void SetCurrentDebugLocation(const DebugLoc &L) {
|
||||
|
|
@ -342,6 +355,12 @@ public:
|
|||
SetCurrentDebugLocation(IP->getDebugLoc());
|
||||
}
|
||||
|
||||
explicit IRBuilder(Use &U)
|
||||
: IRBuilderBase(U->getContext()), Folder() {
|
||||
SetInsertPoint(U);
|
||||
SetCurrentDebugLocation(cast<Instruction>(U.getUser())->getDebugLoc());
|
||||
}
|
||||
|
||||
IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP, const T& F)
|
||||
: IRBuilderBase(TheBB->getContext()), Folder(F) {
|
||||
SetInsertPoint(TheBB, IP);
|
||||
|
|
|
|||
Loading…
Reference in New Issue