diff options
author | Andrew Trick <atrick@apple.com> | 2011-06-29 23:01:52 +0000 |
---|---|---|
committer | Andrew Trick <atrick@apple.com> | 2011-06-29 23:01:52 +0000 |
commit | 3290239daff266dce1051dfd103106956e05a7b1 (patch) | |
tree | 9312bf693dc9e30a61d003286445ef79ecc7ddb2 /include/llvm/Support/IRBuilder.h | |
parent | 45f454d5691cc23584992974f4460728a02186c8 (diff) | |
download | external_llvm-3290239daff266dce1051dfd103106956e05a7b1.zip external_llvm-3290239daff266dce1051dfd103106956e05a7b1.tar.gz external_llvm-3290239daff266dce1051dfd103106956e05a7b1.tar.bz2 |
Added IRBuilder::SetInsertPoint(Use) to find a valid insertion point
that dominates the given Use.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@134111 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Support/IRBuilder.h')
-rw-r--r-- | include/llvm/Support/IRBuilder.h | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/include/llvm/Support/IRBuilder.h b/include/llvm/Support/IRBuilder.h index 9058e3e..9459280 100644 --- a/include/llvm/Support/IRBuilder.h +++ b/include/llvm/Support/IRBuilder.h @@ -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); |