aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm/Support/IRBuilder.h
diff options
context:
space:
mode:
authorAndrew Trick <atrick@apple.com>2011-06-29 23:01:52 +0000
committerAndrew Trick <atrick@apple.com>2011-06-29 23:01:52 +0000
commit3290239daff266dce1051dfd103106956e05a7b1 (patch)
tree9312bf693dc9e30a61d003286445ef79ecc7ddb2 /include/llvm/Support/IRBuilder.h
parent45f454d5691cc23584992974f4460728a02186c8 (diff)
downloadexternal_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.h19
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);