| ; RUN: opt < %s -S -ipsccp | FileCheck %s |
| |
| ; After the first round of Solver.Solve(), the return value of @testf still |
| ; undefined as we hit a branch on undef. Therefore the conditional branch on |
| ; @testf's return value in @bar is unknown. In ResolvedUndefsIn, we force the |
| ; false branch to be feasible. We later discover that @testf actually |
| ; returns true, so we end up with an unfolded "br i1 true". |
| define void @test1() { |
| ; CHECK-LABEL: @test1( |
| ; CHECK-LABEL: if.then: |
| ; CHECK: [[CALL:%.+]] = call i1 @testf() |
| ; CHECK-NEXT: br i1 true, label %if.end, label %if.then |
| ; |
| entry: |
| br label %if.then |
| if.then: ; preds = %entry, %if.then |
| %foo = phi i32 [ 0, %entry], [ %next, %if.then] |
| %next = add i32 %foo, 1 |
| %call = call i1 @testf() |
| br i1 %call, label %if.end, label %if.then |
| |
| if.end: ; preds = %if.then, %entry |
| ret void |
| } |
| |
| define internal i1 @testf() { |
| ; CHECK-LABEL: define internal i1 @testf( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label [[IF_END3:%.*]] |
| ; CHECK: if.end3: |
| ; CHECK-NEXT: ret i1 undef |
| ; |
| entry: |
| br i1 undef, label %if.then1, label %if.end3 |
| |
| if.then1: ; preds = %if.end |
| br label %if.end3 |
| |
| if.end3: ; preds = %if.then1, %entry |
| ret i1 true |
| } |
| |
| |
| ; Call sites in unreachable blocks should not be a problem. |
| ; CHECK-LABEL: define i1 @test2() { |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label %if.end |
| ; CHECK-LABEL: if.end: ; preds = %entry |
| ; CHECK-NEXT: %call2 = call i1 @testf() |
| ; CHECK-NEXT: ret i1 true |
| define i1 @test2() { |
| entry: |
| br label %if.end |
| |
| if.then: ; preds = %entry, %if.then |
| %call = call i1 @testf() |
| br i1 %call, label %if.end, label %if.then |
| |
| if.end: ; preds = %if.then, %entry |
| %call2 = call i1 @testf() |
| ret i1 %call2 |
| } |