xref: /llvm-project/llvm/test/Transforms/InstCombine/switch-select.ll (revision 5fe146672d2b1c9f257a6ee045e0bc13fed1e504)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3
4define void @test_ult_rhsc(i8 %x) {
5; CHECK-LABEL: define void @test_ult_rhsc(
6; CHECK-SAME: i8 [[X:%.*]]) {
7; CHECK-NEXT:    switch i8 [[X]], label [[BB1:%.*]] [
8; CHECK-NEXT:      i8 2, label [[BB2:%.*]]
9; CHECK-NEXT:      i8 12, label [[BB3:%.*]]
10; CHECK-NEXT:    ]
11; CHECK:       bb1:
12; CHECK-NEXT:    call void @func1()
13; CHECK-NEXT:    unreachable
14; CHECK:       bb2:
15; CHECK-NEXT:    call void @func2()
16; CHECK-NEXT:    unreachable
17; CHECK:       bb3:
18; CHECK-NEXT:    call void @func3()
19; CHECK-NEXT:    unreachable
20;
21  %val = add nsw i8 %x, -2
22  %cmp = icmp ult i8 %val, 11
23  %cond = select i1 %cmp, i8 %val, i8 6
24  switch i8 %cond, label %bb1 [
25  i8 0, label %bb2
26  i8 10, label %bb3
27  ]
28
29bb1:
30  call void @func1()
31  unreachable
32bb2:
33  call void @func2()
34  unreachable
35bb3:
36  call void @func3()
37  unreachable
38}
39
40define void @test_eq_lhsc(i8 %x) {
41; CHECK-LABEL: define void @test_eq_lhsc(
42; CHECK-SAME: i8 [[X:%.*]]) {
43; CHECK-NEXT:    switch i8 [[X]], label [[BB1:%.*]] [
44; CHECK-NEXT:      i8 0, label [[BB2:%.*]]
45; CHECK-NEXT:      i8 10, label [[BB3:%.*]]
46; CHECK-NEXT:    ]
47; CHECK:       bb1:
48; CHECK-NEXT:    call void @func1()
49; CHECK-NEXT:    unreachable
50; CHECK:       bb2:
51; CHECK-NEXT:    call void @func2()
52; CHECK-NEXT:    unreachable
53; CHECK:       bb3:
54; CHECK-NEXT:    call void @func3()
55; CHECK-NEXT:    unreachable
56;
57  %cmp = icmp eq i8 %x, 4
58  %cond = select i1 %cmp, i8 6, i8 %x
59  switch i8 %cond, label %bb1 [
60  i8 0, label %bb2
61  i8 10, label %bb3
62  ]
63
64bb1:
65  call void @func1()
66  unreachable
67bb2:
68  call void @func2()
69  unreachable
70bb3:
71  call void @func3()
72  unreachable
73}
74
75define void @test_ult_rhsc_invalid_cond(i8 %x, i8 %y) {
76; CHECK-LABEL: define void @test_ult_rhsc_invalid_cond(
77; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
78; CHECK-NEXT:    [[VAL:%.*]] = add nsw i8 [[X]], -2
79; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8 [[Y]], 11
80; CHECK-NEXT:    [[COND:%.*]] = select i1 [[CMP]], i8 [[VAL]], i8 6
81; CHECK-NEXT:    switch i8 [[COND]], label [[BB1:%.*]] [
82; CHECK-NEXT:      i8 0, label [[BB2:%.*]]
83; CHECK-NEXT:      i8 10, label [[BB3:%.*]]
84; CHECK-NEXT:      i8 13, label [[BB3]]
85; CHECK-NEXT:    ]
86; CHECK:       bb1:
87; CHECK-NEXT:    call void @func1()
88; CHECK-NEXT:    unreachable
89; CHECK:       bb2:
90; CHECK-NEXT:    call void @func2()
91; CHECK-NEXT:    unreachable
92; CHECK:       bb3:
93; CHECK-NEXT:    call void @func3()
94; CHECK-NEXT:    unreachable
95;
96  %val = add nsw i8 %x, -2
97  %cmp = icmp ult i8 %y, 11
98  %cond = select i1 %cmp, i8 %val, i8 6
99  switch i8 %cond, label %bb1 [
100  i8 0, label %bb2
101  i8 10, label %bb3
102  i8 13, label %bb3
103  ]
104
105bb1:
106  call void @func1()
107  unreachable
108bb2:
109  call void @func2()
110  unreachable
111bb3:
112  call void @func3()
113  unreachable
114}
115
116define void @test_ult_rhsc_fail(i8 %x) {
117; CHECK-LABEL: define void @test_ult_rhsc_fail(
118; CHECK-SAME: i8 [[X:%.*]]) {
119; CHECK-NEXT:    [[VAL:%.*]] = add nsw i8 [[X]], -2
120; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8 [[VAL]], 11
121; CHECK-NEXT:    [[COND:%.*]] = select i1 [[CMP]], i8 [[VAL]], i8 6
122; CHECK-NEXT:    switch i8 [[COND]], label [[BB1:%.*]] [
123; CHECK-NEXT:      i8 0, label [[BB2:%.*]]
124; CHECK-NEXT:      i8 10, label [[BB3:%.*]]
125; CHECK-NEXT:      i8 13, label [[BB3]]
126; CHECK-NEXT:    ]
127; CHECK:       bb1:
128; CHECK-NEXT:    call void @func1()
129; CHECK-NEXT:    unreachable
130; CHECK:       bb2:
131; CHECK-NEXT:    call void @func2()
132; CHECK-NEXT:    unreachable
133; CHECK:       bb3:
134; CHECK-NEXT:    call void @func3()
135; CHECK-NEXT:    unreachable
136;
137  %val = add nsw i8 %x, -2
138  %cmp = icmp ult i8 %val, 11
139  %cond = select i1 %cmp, i8 %val, i8 6
140  switch i8 %cond, label %bb1 [
141  i8 0, label %bb2
142  i8 10, label %bb3
143  i8 13, label %bb3
144  ]
145
146bb1:
147  call void @func1()
148  unreachable
149bb2:
150  call void @func2()
151  unreachable
152bb3:
153  call void @func3()
154  unreachable
155}
156
157declare void @func1()
158declare void @func2()
159declare void @func3()
160