Skip to content

Commit

Permalink
[InstCombine] Add tests for phi to cond with switch (NFC)
Browse files Browse the repository at this point in the history
Currently we only handle br but not switch in this fold.
  • Loading branch information
nikic committed Mar 2, 2022
1 parent 05d7e9f commit 85491fb
Showing 1 changed file with 293 additions and 0 deletions.
293 changes: 293 additions & 0 deletions llvm/test/Transforms/InstCombine/simple_phi_condition.ll
Expand Up @@ -261,3 +261,296 @@ merge:
%ret = phi i1 [ true, %if.true ], [ false, %if2.true ], [ false, %if2.false ]
ret i1 %ret
}

define i8 @test_switch(i8 %cond) {
; CHECK-LABEL: @test_switch(
; CHECK-NEXT: entry:
; CHECK-NEXT: switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
; CHECK-NEXT: i8 1, label [[SW_1:%.*]]
; CHECK-NEXT: i8 7, label [[SW_7:%.*]]
; CHECK-NEXT: i8 19, label [[SW_19:%.*]]
; CHECK-NEXT: ]
; CHECK: sw.1:
; CHECK-NEXT: br label [[MERGE:%.*]]
; CHECK: sw.7:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: sw.19:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: default:
; CHECK-NEXT: ret i8 42
; CHECK: merge:
; CHECK-NEXT: [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ], [ 19, [[SW_19]] ]
; CHECK-NEXT: ret i8 [[RET]]
;
entry:
switch i8 %cond, label %default [
i8 1, label %sw.1
i8 7, label %sw.7
i8 19, label %sw.19
]

sw.1:
br label %merge

sw.7:
br label %merge

sw.19:
br label %merge

default:
ret i8 42

merge:
%ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ], [ 19, %sw.19 ]
ret i8 %ret
}

define i8 @test_switch_direct_edge(i8 %cond) {
; CHECK-LABEL: @test_switch_direct_edge(
; CHECK-NEXT: entry:
; CHECK-NEXT: switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
; CHECK-NEXT: i8 1, label [[SW_1:%.*]]
; CHECK-NEXT: i8 7, label [[SW_7:%.*]]
; CHECK-NEXT: i8 19, label [[MERGE:%.*]]
; CHECK-NEXT: ]
; CHECK: sw.1:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: sw.7:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: default:
; CHECK-NEXT: ret i8 42
; CHECK: merge:
; CHECK-NEXT: [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ], [ 19, [[ENTRY:%.*]] ]
; CHECK-NEXT: ret i8 [[RET]]
;
entry:
switch i8 %cond, label %default [
i8 1, label %sw.1
i8 7, label %sw.7
i8 19, label %merge
]

sw.1:
br label %merge

sw.7:
br label %merge

default:
ret i8 42

merge:
%ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ], [ 19, %entry ]
ret i8 %ret
}

define i8 @test_switch_subset(i8 %cond) {
; CHECK-LABEL: @test_switch_subset(
; CHECK-NEXT: entry:
; CHECK-NEXT: switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
; CHECK-NEXT: i8 1, label [[SW_1:%.*]]
; CHECK-NEXT: i8 7, label [[SW_7:%.*]]
; CHECK-NEXT: i8 19, label [[SW_19:%.*]]
; CHECK-NEXT: ]
; CHECK: sw.1:
; CHECK-NEXT: br label [[MERGE:%.*]]
; CHECK: sw.7:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: sw.19:
; CHECK-NEXT: ret i8 24
; CHECK: default:
; CHECK-NEXT: ret i8 42
; CHECK: merge:
; CHECK-NEXT: [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ]
; CHECK-NEXT: ret i8 [[RET]]
;
entry:
switch i8 %cond, label %default [
i8 1, label %sw.1
i8 7, label %sw.7
i8 19, label %sw.19
]

sw.1:
br label %merge

sw.7:
br label %merge

sw.19:
ret i8 24

default:
ret i8 42

merge:
%ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ]
ret i8 %ret
}

define i8 @test_switch_wrong_value(i8 %cond) {
; CHECK-LABEL: @test_switch_wrong_value(
; CHECK-NEXT: entry:
; CHECK-NEXT: switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
; CHECK-NEXT: i8 1, label [[SW_1:%.*]]
; CHECK-NEXT: i8 7, label [[SW_7:%.*]]
; CHECK-NEXT: i8 19, label [[SW_19:%.*]]
; CHECK-NEXT: ]
; CHECK: sw.1:
; CHECK-NEXT: br label [[MERGE:%.*]]
; CHECK: sw.7:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: sw.19:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: default:
; CHECK-NEXT: ret i8 42
; CHECK: merge:
; CHECK-NEXT: [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ], [ 10, [[SW_19]] ]
; CHECK-NEXT: ret i8 [[RET]]
;
entry:
switch i8 %cond, label %default [
i8 1, label %sw.1
i8 7, label %sw.7
i8 19, label %sw.19
]

sw.1:
br label %merge

sw.7:
br label %merge

sw.19:
br label %merge

default:
ret i8 42

merge:
%ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ], [ 10, %sw.19 ]
ret i8 %ret
}

define i8 @test_switch_inverted(i8 %cond) {
; CHECK-LABEL: @test_switch_inverted(
; CHECK-NEXT: entry:
; CHECK-NEXT: switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
; CHECK-NEXT: i8 0, label [[SW_0:%.*]]
; CHECK-NEXT: i8 1, label [[SW_1:%.*]]
; CHECK-NEXT: i8 2, label [[SW_2:%.*]]
; CHECK-NEXT: ]
; CHECK: sw.0:
; CHECK-NEXT: br label [[MERGE:%.*]]
; CHECK: sw.1:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: sw.2:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: default:
; CHECK-NEXT: ret i8 42
; CHECK: merge:
; CHECK-NEXT: [[RET:%.*]] = phi i8 [ -1, [[SW_0]] ], [ -2, [[SW_1]] ], [ -3, [[SW_2]] ]
; CHECK-NEXT: ret i8 [[RET]]
;
entry:
switch i8 %cond, label %default [
i8 0, label %sw.0
i8 1, label %sw.1
i8 2, label %sw.2
]

sw.0:
br label %merge

sw.1:
br label %merge

sw.2:
br label %merge

default:
ret i8 42

merge:
%ret = phi i8 [ -1, %sw.0 ], [ -2, %sw.1 ], [ -3, %sw.2 ]
ret i8 %ret
}

define i8 @test_switch_duplicate_edge(i8 %cond) {
; CHECK-LABEL: @test_switch_duplicate_edge(
; CHECK-NEXT: entry:
; CHECK-NEXT: switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
; CHECK-NEXT: i8 1, label [[SW_1:%.*]]
; CHECK-NEXT: i8 7, label [[SW_7:%.*]]
; CHECK-NEXT: i8 19, label [[SW_7]]
; CHECK-NEXT: ]
; CHECK: sw.1:
; CHECK-NEXT: br label [[MERGE:%.*]]
; CHECK: sw.7:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: default:
; CHECK-NEXT: ret i8 42
; CHECK: merge:
; CHECK-NEXT: [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ]
; CHECK-NEXT: ret i8 [[RET]]
;
entry:
switch i8 %cond, label %default [
i8 1, label %sw.1
i8 7, label %sw.7
i8 19, label %sw.7
]

sw.1:
br label %merge

sw.7:
br label %merge

default:
ret i8 42

merge:
%ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ]
ret i8 %ret
}

define i8 @test_switch_default_edge(i8 %cond) {
; CHECK-LABEL: @test_switch_default_edge(
; CHECK-NEXT: entry:
; CHECK-NEXT: switch i8 [[COND:%.*]], label [[MERGE:%.*]] [
; CHECK-NEXT: i8 1, label [[SW_1:%.*]]
; CHECK-NEXT: i8 7, label [[SW_7:%.*]]
; CHECK-NEXT: i8 19, label [[SW_19:%.*]]
; CHECK-NEXT: ]
; CHECK: sw.1:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: sw.7:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: sw.19:
; CHECK-NEXT: br label [[MERGE]]
; CHECK: merge:
; CHECK-NEXT: [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ], [ 19, [[SW_19]] ], [ 42, [[ENTRY:%.*]] ]
; CHECK-NEXT: ret i8 [[RET]]
;
entry:
switch i8 %cond, label %merge [
i8 1, label %sw.1
i8 7, label %sw.7
i8 19, label %sw.19
]

sw.1:
br label %merge

sw.7:
br label %merge

sw.19:
br label %merge

merge:
%ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ], [ 19, %sw.19 ], [ 42, %entry ]
ret i8 %ret
}

0 comments on commit 85491fb

Please sign in to comment.