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