Skip to content

Commit 0cb3530

Browse files
committed
[ConstraintElim] Add additional switch case and use i8 instead of i32.
Shorten the types used to i8 for cheaper verification and add test case where 2 cases have the same destination, as suggested in #67061.
1 parent b61b242 commit 0cb3530

File tree

1 file changed

+96
-51
lines changed
  • llvm/test/Transforms/ConstraintElimination

1 file changed

+96
-51
lines changed

llvm/test/Transforms/ConstraintElimination/switch.ll

Lines changed: 96 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -3,143 +3,188 @@
33

44
declare void @may_unwind()
55

6-
define i1 @test_switch_in_block_with_assume(i32 %x) {
6+
define i1 @test_switch_in_block_with_assume(i8 %x) {
77
; CHECK-LABEL: @test_switch_in_block_with_assume(
88
; CHECK-NEXT: entry:
99
; CHECK-NEXT: call void @may_unwind()
10-
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i32 [[X:%.*]], 10
10+
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[X:%.*]], 10
1111
; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]])
12-
; CHECK-NEXT: switch i32 0, label [[EXIT_1:%.*]] [
13-
; CHECK-NEXT: i32 1, label [[EXIT_2:%.*]]
12+
; CHECK-NEXT: switch i8 0, label [[EXIT_1:%.*]] [
13+
; CHECK-NEXT: i8 1, label [[EXIT_2:%.*]]
1414
; CHECK-NEXT: ]
1515
; CHECK: exit.1:
16-
; CHECK-NEXT: [[C_2:%.*]] = icmp ult i32 [[X]], 9
16+
; CHECK-NEXT: [[C_2:%.*]] = icmp ult i8 [[X]], 9
1717
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, [[C_2]]
1818
; CHECK-NEXT: ret i1 [[RES_1]]
1919
; CHECK: exit.2:
20-
; CHECK-NEXT: [[C_3:%.*]] = icmp ult i32 [[X]], 9
20+
; CHECK-NEXT: [[C_3:%.*]] = icmp ult i8 [[X]], 9
2121
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 true, [[C_3]]
2222
; CHECK-NEXT: ret i1 [[RES_2]]
2323
;
2424
entry:
2525
call void @may_unwind()
26-
%c.1 = icmp ult i32 %x, 10
26+
%c.1 = icmp ult i8 %x, 10
2727
call void @llvm.assume(i1 %c.1)
28-
switch i32 0, label %exit.1 [
29-
i32 1, label %exit.2
28+
switch i8 0, label %exit.1 [
29+
i8 1, label %exit.2
3030
]
3131

3232
exit.1:
33-
%t.1 = icmp ult i32 %x, 10
34-
%c.2 = icmp ult i32 %x, 9
33+
%t.1 = icmp ult i8 %x, 10
34+
%c.2 = icmp ult i8 %x, 9
3535
%res.1 = xor i1 %t.1, %c.2
3636
ret i1 %res.1
3737

3838
exit.2:
39-
%t.2 = icmp ult i32 %x, 10
40-
%c.3 = icmp ult i32 %x, 9
39+
%t.2 = icmp ult i8 %x, 10
40+
%c.3 = icmp ult i8 %x, 9
4141
%res.2 = xor i1 %t.2, %c.3
4242
ret i1 %res.2
4343
}
4444

4545
declare void @llvm.assume(i1)
4646

47-
define i1 @simplify_based_on_switch(i32 %x) {
47+
define i1 @simplify_based_on_switch(i8 %x) {
4848
; CHECK-LABEL: @simplify_based_on_switch(
4949
; CHECK-NEXT: entry:
50-
; CHECK-NEXT: switch i32 [[X:%.*]], label [[EXIT_1:%.*]] [
51-
; CHECK-NEXT: i32 6, label [[EXIT_2:%.*]]
52-
; CHECK-NEXT: i32 10, label [[EXIT_3:%.*]]
50+
; CHECK-NEXT: switch i8 [[X:%.*]], label [[EXIT_1:%.*]] [
51+
; CHECK-NEXT: i8 6, label [[EXIT_2:%.*]]
52+
; CHECK-NEXT: i8 10, label [[EXIT_3:%.*]]
5353
; CHECK-NEXT: ]
5454
; CHECK: exit.1:
55-
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i32 [[X]], 7
56-
; CHECK-NEXT: [[C_2:%.*]] = icmp ult i32 [[X]], 6
55+
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[X]], 7
56+
; CHECK-NEXT: [[C_2:%.*]] = icmp ult i8 [[X]], 6
5757
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]
5858
; CHECK-NEXT: ret i1 [[RES_1]]
5959
; CHECK: exit.2:
60-
; CHECK-NEXT: [[T_1:%.*]] = icmp ult i32 [[X]], 7
61-
; CHECK-NEXT: [[F_1:%.*]] = icmp ult i32 [[X]], 6
60+
; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[X]], 7
61+
; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[X]], 6
6262
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[T_1]], [[F_1]]
6363
; CHECK-NEXT: ret i1 [[RES_2]]
6464
; CHECK: exit.3:
65-
; CHECK-NEXT: [[T_2:%.*]] = icmp ult i32 [[X]], 11
66-
; CHECK-NEXT: [[F_2:%.*]] = icmp ult i32 [[X]], 10
65+
; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[X]], 11
66+
; CHECK-NEXT: [[F_2:%.*]] = icmp ult i8 [[X]], 10
6767
; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[T_2]], [[F_2]]
6868
; CHECK-NEXT: ret i1 [[RES_3]]
6969
;
7070
entry:
71-
switch i32 %x, label %exit.1 [
72-
i32 6, label %exit.2
73-
i32 10, label %exit.3
71+
switch i8 %x, label %exit.1 [
72+
i8 6, label %exit.2
73+
i8 10, label %exit.3
7474
]
7575

7676
exit.1:
77-
%c.1 = icmp ult i32 %x, 7
78-
%c.2 = icmp ult i32 %x, 6
77+
%c.1 = icmp ult i8 %x, 7
78+
%c.2 = icmp ult i8 %x, 6
7979
%res.1 = xor i1 %c.1, %c.2
8080
ret i1 %res.1
8181

8282
exit.2:
83-
%t.1 = icmp ult i32 %x, 7
84-
%f.1 = icmp ult i32 %x, 6
83+
%t.1 = icmp ult i8 %x, 7
84+
%f.1 = icmp ult i8 %x, 6
8585
%res.2 = xor i1 %t.1, %f.1
8686
ret i1 %res.2
8787

8888
exit.3:
89-
%t.2 = icmp ult i32 %x, 11
90-
%f.2 = icmp ult i32 %x, 10
89+
%t.2 = icmp ult i8 %x, 11
90+
%f.2 = icmp ult i8 %x, 10
9191
%res.3 = xor i1 %t.2, %f.2
9292
ret i1 %res.3
9393
}
9494

95-
define i1 @simplify_based_on_switch_successor_branches(i32 %x) {
95+
define i1 @simplify_based_on_switch_successor_branches(i8 %x) {
9696
; CHECK-LABEL: @simplify_based_on_switch_successor_branches(
9797
; CHECK-NEXT: entry:
98-
; CHECK-NEXT: switch i32 [[X:%.*]], label [[EXIT_1:%.*]] [
99-
; CHECK-NEXT: i32 6, label [[EXIT_2:%.*]]
100-
; CHECK-NEXT: i32 10, label [[EXIT_3:%.*]]
98+
; CHECK-NEXT: switch i8 [[X:%.*]], label [[EXIT_1:%.*]] [
99+
; CHECK-NEXT: i8 6, label [[EXIT_2:%.*]]
100+
; CHECK-NEXT: i8 10, label [[EXIT_3:%.*]]
101101
; CHECK-NEXT: ]
102102
; CHECK: exit.1:
103-
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i32 [[X]], 7
104-
; CHECK-NEXT: [[C_2:%.*]] = icmp ult i32 [[X]], 6
103+
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[X]], 7
104+
; CHECK-NEXT: [[C_2:%.*]] = icmp ult i8 [[X]], 6
105105
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]
106106
; CHECK-NEXT: ret i1 [[RES_1]]
107107
; CHECK: exit.2:
108-
; CHECK-NEXT: [[T_1:%.*]] = icmp ult i32 [[X]], 7
109-
; CHECK-NEXT: [[F_1:%.*]] = icmp ult i32 [[X]], 6
108+
; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[X]], 7
109+
; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[X]], 6
110110
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[T_1]], [[F_1]]
111111
; CHECK-NEXT: call void @use(i1 [[RES_2]])
112112
; CHECK-NEXT: br label [[EXIT_3]]
113113
; CHECK: exit.3:
114-
; CHECK-NEXT: [[C_3:%.*]] = icmp ult i32 [[X]], 11
115-
; CHECK-NEXT: [[C_4:%.*]] = icmp ult i32 [[X]], 10
114+
; CHECK-NEXT: [[C_3:%.*]] = icmp ult i8 [[X]], 11
115+
; CHECK-NEXT: [[C_4:%.*]] = icmp ult i8 [[X]], 10
116116
; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[C_3]], [[C_4]]
117117
; CHECK-NEXT: ret i1 [[RES_3]]
118118
;
119119
entry:
120-
switch i32 %x, label %exit.1 [
121-
i32 6, label %exit.2
122-
i32 10, label %exit.3
120+
switch i8 %x, label %exit.1 [
121+
i8 6, label %exit.2
122+
i8 10, label %exit.3
123123
]
124124

125125
exit.1:
126-
%c.1 = icmp ult i32 %x, 7
127-
%c.2 = icmp ult i32 %x, 6
126+
%c.1 = icmp ult i8 %x, 7
127+
%c.2 = icmp ult i8 %x, 6
128128
%res.1 = xor i1 %c.1, %c.2
129129
ret i1 %res.1
130130

131131
exit.2:
132-
%t.1 = icmp ult i32 %x, 7
133-
%f.1 = icmp ult i32 %x, 6
132+
%t.1 = icmp ult i8 %x, 7
133+
%f.1 = icmp ult i8 %x, 6
134134
%res.2 = xor i1 %t.1, %f.1
135135
call void @use(i1 %res.2)
136136
br label %exit.3
137137

138138
exit.3:
139-
%c.3 = icmp ult i32 %x, 11
140-
%c.4 = icmp ult i32 %x, 10
139+
%c.3 = icmp ult i8 %x, 11
140+
%c.4 = icmp ult i8 %x, 10
141141
%res.3 = xor i1 %c.3, %c.4
142142
ret i1 %res.3
143143
}
144144

145+
define i1 @switch_same_destination_for_different_cases(i8 %x) {
146+
; CHECK-LABEL: @switch_same_destination_for_different_cases(
147+
; CHECK-NEXT: entry:
148+
; CHECK-NEXT: switch i8 [[X:%.*]], label [[EXIT_1:%.*]] [
149+
; CHECK-NEXT: i8 6, label [[EXIT_2:%.*]]
150+
; CHECK-NEXT: i8 10, label [[EXIT_2]]
151+
; CHECK-NEXT: ]
152+
; CHECK: exit.1:
153+
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[X]], 7
154+
; CHECK-NEXT: [[C_2:%.*]] = icmp ult i8 [[X]], 6
155+
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]
156+
; CHECK-NEXT: ret i1 [[RES_1]]
157+
; CHECK: exit.2:
158+
; CHECK-NEXT: [[C_3:%.*]] = icmp ult i8 [[X]], 7
159+
; CHECK-NEXT: call void @use(i1 [[C_3]])
160+
; CHECK-NEXT: [[C_4:%.*]] = icmp ult i8 [[X]], 6
161+
; CHECK-NEXT: call void @use(i1 [[C_4]])
162+
; CHECK-NEXT: [[C_5:%.*]] = icmp ult i8 [[X]], 11
163+
; CHECK-NEXT: call void @use(i1 [[C_5]])
164+
; CHECK-NEXT: [[C_6:%.*]] = icmp ult i8 [[X]], 10
165+
; CHECK-NEXT: ret i1 [[C_6]]
166+
;
167+
entry:
168+
switch i8 %x, label %exit.1 [
169+
i8 6, label %exit.2
170+
i8 10, label %exit.2
171+
]
172+
173+
exit.1:
174+
%c.1 = icmp ult i8 %x, 7
175+
%c.2 = icmp ult i8 %x, 6
176+
%res.1 = xor i1 %c.1, %c.2
177+
ret i1 %res.1
178+
179+
exit.2:
180+
%c.3 = icmp ult i8 %x, 7
181+
call void @use(i1 %c.3)
182+
%c.4 = icmp ult i8 %x, 6
183+
call void @use(i1 %c.4)
184+
%c.5 = icmp ult i8 %x, 11
185+
call void @use(i1 %c.5)
186+
%c.6 = icmp ult i8 %x, 10
187+
ret i1 %c.6
188+
}
189+
145190
declare void @use(i1)

0 commit comments

Comments
 (0)