From e98e9a154036d6f25c1e0c9a62962932f601c05c Mon Sep 17 00:00:00 2001 From: Andrew Trick Date: Wed, 29 Jun 2011 23:01:52 +0000 Subject: Added IRBuilder::SetInsertPoint(Use) to find a valid insertion point that dominates the given Use. llvm-svn: 134111 --- llvm/include/llvm/Support/IRBuilder.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'llvm') diff --git a/llvm/include/llvm/Support/IRBuilder.h b/llvm/include/llvm/Support/IRBuilder.h index 9058e3e2535..94592800fe4 100644 --- a/llvm/include/llvm/Support/IRBuilder.h +++ b/llvm/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(U.getUser()); + if (PHINode *Phi = dyn_cast(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(U.getUser())->getDebugLoc()); + } + IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP, const T& F) : IRBuilderBase(TheBB->getContext()), Folder(F) { SetInsertPoint(TheBB, IP); -- cgit v1.2.3