diff options
| -rw-r--r-- | clang/lib/CodeGen/CGStmt.cpp | 14 | ||||
| -rw-r--r-- | clang/test/CodeGen/forwarding-blocks-if.c | 36 |
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 |

