aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/CodeGen/CGStmt.cpp8
-rw-r--r--lib/CodeGen/CodeGenFunction.h7
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