summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/CodeGen/CGStmt.cpp14
-rw-r--r--clang/test/CodeGen/forwarding-blocks-if.c36
2 files changed, 49 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp
index 29889dd6b50..ee6e3ebb356 100644
--- a/clang/lib/CodeGen/CGStmt.cpp
+++ b/clang/lib/CodeGen/CGStmt.cpp
@@ -613,7 +613,14 @@ void CodeGenFunction::EmitIfStmt(const IfStmt &S) {
RunCleanupsScope ThenScope(*this);
EmitStmt(S.getThen());
}
- EmitBranch(ContBlock);
+ {
+ auto CurBlock = Builder.GetInsertBlock();
+ EmitBranch(ContBlock);
+ // Eliminate any empty blocks that may have been created by nested
+ // control flow statements in the 'then' clause.
+ if (CurBlock)
+ SimplifyForwardingBlocks(CurBlock);
+ }
// Emit the 'else' code if present.
if (const Stmt *Else = S.getElse()) {
@@ -629,7 +636,12 @@ void CodeGenFunction::EmitIfStmt(const IfStmt &S) {
{
// There is no need to emit line number for an unconditional branch.
auto NL = ApplyDebugLocation::CreateEmpty(*this);
+ auto CurBlock = Builder.GetInsertBlock();
EmitBranch(ContBlock);
+ // Eliminate any empty blocks that may have been created by nested
+ // control flow statements emitted in the 'else' clause.
+ if (CurBlock)
+ SimplifyForwardingBlocks(CurBlock);
}
}
diff --git a/clang/test/CodeGen/forwarding-blocks-if.c b/clang/test/CodeGen/forwarding-blocks-if.c
new file mode 100644
index 00000000000..19c8d61d9cc
--- /dev/null
+++ b/clang/test/CodeGen/forwarding-blocks-if.c
@@ -0,0 +1,36 @@
+// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
+// Check that no empty blocks are generated for nested ifs.
+
+extern void func();
+
+int f0(int val) {
+ if (val == 0) {
+ func();
+ } else if (val == 1) {
+ func();
+ }
+ return 0;
+}
+
+// CHECK-LABEL: define i32 @f0
+// CHECK: call void {{.*}} @func
+// CHECK: call void {{.*}} @func
+// CHECK: br label %[[RETBLOCK1:[^ ]*]]
+// CHECK: [[RETBLOCK1]]:
+// CHECK-NOT: br label
+// CHECK: ret i32
+
+int f1(int val, int g) {
+ if (val == 0)
+ if (g == 1) {
+ func();
+ }
+ return 0;
+}
+
+// CHECK-LABEL: define i32 @f1
+// CHECK: call void {{.*}} @func
+// CHECK: br label %[[RETBLOCK2:[^ ]*]]
+// CHECK: [[RETBLOCK2]]:
+// CHECK-NOT: br label
+// CHECK: ret i32
OpenPOWER on IntegriCloud