[InstCombine] Add more tests for phi to cond fold (NFC)

These have more than two predecessors.
This commit is contained in:
Nikita Popov 2022-03-01 15:47:28 +01:00
parent c74f54f2f4
commit a968bee093
1 changed files with 108 additions and 0 deletions

View File

@ -134,3 +134,111 @@ merge:
%ret = phi i1 [false, %if.true.end], [true, %if.false]
ret i1 %ret
}
define i1 @test_multiple_predecessors(i1 %cond, i1 %cond2) {
; CHECK-LABEL: @test_multiple_predecessors(
; CHECK-NEXT: entry:
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
; CHECK: if.true:
; CHECK-NEXT: br label [[MERGE:%.*]]
; CHECK: if.false:
; CHECK-NEXT: br i1 [[COND2:%.*]], label [[IF2_TRUE:%.*]], label [[IF2_FALSE:%.*]]
; CHECK: if2.true:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: if2.false:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: merge:
; CHECK-NEXT: [[RET:%.*]] = phi i1 [ true, [[IF_TRUE]] ], [ false, [[IF2_TRUE]] ], [ false, [[IF2_FALSE]] ]
; CHECK-NEXT: ret i1 [[RET]]
;
entry:
br i1 %cond, label %if.true, label %if.false
if.true:
br label %merge
if.false:
br i1 %cond2, label %if2.true, label %if2.false
if2.true:
br label %merge
if2.false:
br label %merge
merge:
%ret = phi i1 [ true, %if.true ], [ false, %if2.true ], [ false, %if2.false ]
ret i1 %ret
}
define i1 @test_multiple_predecessors_wrong_value(i1 %cond, i1 %cond2) {
; CHECK-LABEL: @test_multiple_predecessors_wrong_value(
; CHECK-NEXT: entry:
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
; CHECK: if.true:
; CHECK-NEXT: br label [[MERGE:%.*]]
; CHECK: if.false:
; CHECK-NEXT: br i1 [[COND2:%.*]], label [[IF2_TRUE:%.*]], label [[IF2_FALSE:%.*]]
; CHECK: if2.true:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: if2.false:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: merge:
; CHECK-NEXT: [[RET:%.*]] = phi i1 [ true, [[IF_TRUE]] ], [ true, [[IF2_TRUE]] ], [ false, [[IF2_FALSE]] ]
; CHECK-NEXT: ret i1 [[RET]]
;
entry:
br i1 %cond, label %if.true, label %if.false
if.true:
br label %merge
if.false:
br i1 %cond2, label %if2.true, label %if2.false
if2.true:
br label %merge
if2.false:
br label %merge
merge:
%ret = phi i1 [ true, %if.true ], [ true, %if2.true ], [ false, %if2.false ]
ret i1 %ret
}
define i1 @test_multiple_predecessors_no_edge_domination(i1 %cond, i1 %cond2) {
; CHECK-LABEL: @test_multiple_predecessors_no_edge_domination(
; CHECK-NEXT: entry:
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
; CHECK: if.true:
; CHECK-NEXT: br i1 [[COND2:%.*]], label [[MERGE:%.*]], label [[IF_FALSE]]
; CHECK: if.false:
; CHECK-NEXT: br i1 [[COND2]], label [[IF2_TRUE:%.*]], label [[IF2_FALSE:%.*]]
; CHECK: if2.true:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: if2.false:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: merge:
; CHECK-NEXT: [[RET:%.*]] = phi i1 [ true, [[IF_TRUE]] ], [ false, [[IF2_TRUE]] ], [ false, [[IF2_FALSE]] ]
; CHECK-NEXT: ret i1 [[RET]]
;
entry:
br i1 %cond, label %if.true, label %if.false
if.true:
br i1 %cond2, label %merge, label %if.false
if.false:
br i1 %cond2, label %if2.true, label %if2.false
if2.true:
br label %merge
if2.false:
br label %merge
merge:
%ret = phi i1 [ true, %if.true ], [ false, %if2.true ], [ false, %if2.false ]
ret i1 %ret
}