diff options
-rw-r--r-- | lib/CodeGen/CGStmt.cpp | 8 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 7 |
2 files changed, 13 insertions, 2 deletions
diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index a66b6fec04..ad081c91f7 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -157,9 +157,15 @@ RValue CodeGenFunction::EmitCompoundStmt(const CompoundStmt &S, bool GetLast, return EmitAnyExpr(cast<Expr>(LastStmt), AggLoc); } -void CodeGenFunction::EmitBlock(llvm::BasicBlock *BB) { +void CodeGenFunction::EmitBlock(llvm::BasicBlock *BB, bool IsFinished) { // Fall out of the current block (if necessary). EmitBranch(BB); + + if (IsFinished && BB->use_empty()) { + delete BB; + return; + } + CurFn->getBasicBlockList().push_back(BB); Builder.SetInsertPoint(BB); } diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 21d8f4f6ed..50b35bd8cd 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -237,7 +237,12 @@ public: /// insert point, adding a fall-through branch from the current /// insert block if necessary. It is legal to call this function /// even if there is no current insertion point. - void EmitBlock(llvm::BasicBlock *BB); + /// + /// IsFinished - If true, indicates that the caller has finished + /// emitting branches to the given block and does not expect to emit + /// code into it. This means the block can be ignored if it is + /// unreachable. + void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false); /// EmitBranch - Emit a branch to the specified basic block from the /// current insert block, taking care to avoid creation of branches |