forked from OSchip/llvm-project
[InstCombine] Add more tests for phi to cond fold (NFC)
These have more than two predecessors.
This commit is contained in:
parent
c74f54f2f4
commit
a968bee093
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue