@@ -48,4 +48,246 @@ define void @test_udiv(i8 %x) {
48
48
ret void
49
49
}
50
50
51
+ define i8 @test_cond (i8 %x ) {
52
+ ; CHECK-LABEL: @test_cond(
53
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
54
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
55
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[EXIT:%.*]]
56
+ ; CHECK: if:
57
+ ; CHECK-NEXT: ret i8 -4
58
+ ; CHECK: exit:
59
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
60
+ ; CHECK-NEXT: ret i8 [[OR2]]
61
+ ;
62
+ %and = and i8 %x , 3
63
+ %cmp = icmp eq i8 %and , 0
64
+ br i1 %cmp , label %if , label %exit
65
+
66
+ if:
67
+ %or1 = or i8 %x , -4
68
+ ret i8 %or1
69
+
70
+ exit:
71
+ %or2 = or i8 %x , -4
72
+ ret i8 %or2
73
+ }
74
+
75
+ define i8 @test_cond_inv (i8 %x ) {
76
+ ; CHECK-LABEL: @test_cond_inv(
77
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
78
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[AND]], 0
79
+ ; CHECK-NEXT: call void @use(i1 [[CMP]])
80
+ ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[IF:%.*]]
81
+ ; CHECK: if:
82
+ ; CHECK-NEXT: ret i8 -4
83
+ ; CHECK: exit:
84
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
85
+ ; CHECK-NEXT: ret i8 [[OR2]]
86
+ ;
87
+ %and = and i8 %x , 3
88
+ %cmp = icmp ne i8 %and , 0
89
+ call void @use (i1 %cmp )
90
+ br i1 %cmp , label %exit , label %if
91
+
92
+ if:
93
+ %or1 = or i8 %x , -4
94
+ ret i8 %or1
95
+
96
+ exit:
97
+ %or2 = or i8 %x , -4
98
+ ret i8 %or2
99
+ }
100
+
101
+ define i8 @test_cond_and (i8 %x , i1 %c ) {
102
+ ; CHECK-LABEL: @test_cond_and(
103
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
104
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
105
+ ; CHECK-NEXT: [[COND:%.*]] = and i1 [[CMP]], [[C:%.*]]
106
+ ; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
107
+ ; CHECK: if:
108
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -4
109
+ ; CHECK-NEXT: ret i8 [[OR1]]
110
+ ; CHECK: exit:
111
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
112
+ ; CHECK-NEXT: ret i8 [[OR2]]
113
+ ;
114
+ %and = and i8 %x , 3
115
+ %cmp = icmp eq i8 %and , 0
116
+ %cond = and i1 %cmp , %c
117
+ br i1 %cond , label %if , label %exit
118
+
119
+ if:
120
+ %or1 = or i8 %x , -4
121
+ ret i8 %or1
122
+
123
+ exit:
124
+ %or2 = or i8 %x , -4
125
+ ret i8 %or2
126
+ }
127
+
128
+ define i8 @test_cond_and_commuted (i8 %x , i1 %c1 , i1 %c2 ) {
129
+ ; CHECK-LABEL: @test_cond_and_commuted(
130
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
131
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
132
+ ; CHECK-NEXT: [[C3:%.*]] = and i1 [[C1:%.*]], [[C2:%.*]]
133
+ ; CHECK-NEXT: [[COND:%.*]] = and i1 [[C3]], [[CMP]]
134
+ ; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
135
+ ; CHECK: if:
136
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -4
137
+ ; CHECK-NEXT: ret i8 [[OR1]]
138
+ ; CHECK: exit:
139
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
140
+ ; CHECK-NEXT: ret i8 [[OR2]]
141
+ ;
142
+ %and = and i8 %x , 3
143
+ %cmp = icmp eq i8 %and , 0
144
+ %c3 = and i1 %c1 , %c2
145
+ %cond = and i1 %c3 , %cmp
146
+ br i1 %cond , label %if , label %exit
147
+
148
+ if:
149
+ %or1 = or i8 %x , -4
150
+ ret i8 %or1
151
+
152
+ exit:
153
+ %or2 = or i8 %x , -4
154
+ ret i8 %or2
155
+ }
156
+
157
+ define i8 @test_cond_logical_and (i8 %x , i1 %c ) {
158
+ ; CHECK-LABEL: @test_cond_logical_and(
159
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
160
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
161
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i1 [[C:%.*]], i1 false
162
+ ; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
163
+ ; CHECK: if:
164
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -4
165
+ ; CHECK-NEXT: ret i8 [[OR1]]
166
+ ; CHECK: exit:
167
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
168
+ ; CHECK-NEXT: ret i8 [[OR2]]
169
+ ;
170
+ %and = and i8 %x , 3
171
+ %cmp = icmp eq i8 %and , 0
172
+ %cond = select i1 %cmp , i1 %c , i1 false
173
+ br i1 %cond , label %if , label %exit
174
+
175
+ if:
176
+ %or1 = or i8 %x , -4
177
+ ret i8 %or1
178
+
179
+ exit:
180
+ %or2 = or i8 %x , -4
181
+ ret i8 %or2
182
+ }
183
+
184
+ define i8 @test_cond_or_invalid (i8 %x , i1 %c ) {
185
+ ; CHECK-LABEL: @test_cond_or_invalid(
186
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
187
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
188
+ ; CHECK-NEXT: [[COND:%.*]] = or i1 [[CMP]], [[C:%.*]]
189
+ ; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
190
+ ; CHECK: if:
191
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -4
192
+ ; CHECK-NEXT: ret i8 [[OR1]]
193
+ ; CHECK: exit:
194
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
195
+ ; CHECK-NEXT: ret i8 [[OR2]]
196
+ ;
197
+ %and = and i8 %x , 3
198
+ %cmp = icmp eq i8 %and , 0
199
+ %cond = or i1 %cmp , %c
200
+ br i1 %cond , label %if , label %exit
201
+
202
+ if:
203
+ %or1 = or i8 %x , -4
204
+ ret i8 %or1
205
+
206
+ exit:
207
+ %or2 = or i8 %x , -4
208
+ ret i8 %or2
209
+ }
210
+
211
+ define i8 @test_cond_inv_or (i8 %x , i1 %c ) {
212
+ ; CHECK-LABEL: @test_cond_inv_or(
213
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
214
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[AND]], 0
215
+ ; CHECK-NEXT: [[COND:%.*]] = or i1 [[CMP]], [[C:%.*]]
216
+ ; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
217
+ ; CHECK: if:
218
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -4
219
+ ; CHECK-NEXT: ret i8 [[OR1]]
220
+ ; CHECK: exit:
221
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
222
+ ; CHECK-NEXT: ret i8 [[OR2]]
223
+ ;
224
+ %and = and i8 %x , 3
225
+ %cmp = icmp ne i8 %and , 0
226
+ %cond = or i1 %cmp , %c
227
+ br i1 %cond , label %if , label %exit
228
+
229
+ if:
230
+ %or1 = or i8 %x , -4
231
+ ret i8 %or1
232
+
233
+ exit:
234
+ %or2 = or i8 %x , -4
235
+ ret i8 %or2
236
+ }
237
+
238
+ define i8 @test_cond_inv_logical_or (i8 %x , i1 %c ) {
239
+ ; CHECK-LABEL: @test_cond_inv_logical_or(
240
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
241
+ ; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i8 [[AND]], 0
242
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP_NOT]], i1 [[C:%.*]], i1 false
243
+ ; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
244
+ ; CHECK: if:
245
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -4
246
+ ; CHECK-NEXT: ret i8 [[OR1]]
247
+ ; CHECK: exit:
248
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
249
+ ; CHECK-NEXT: ret i8 [[OR2]]
250
+ ;
251
+ %and = and i8 %x , 3
252
+ %cmp = icmp ne i8 %and , 0
253
+ %cond = select i1 %cmp , i1 false , i1 %c
254
+ br i1 %cond , label %if , label %exit
255
+
256
+ if:
257
+ %or1 = or i8 %x , -4
258
+ ret i8 %or1
259
+
260
+ exit:
261
+ %or2 = or i8 %x , -4
262
+ ret i8 %or2
263
+ }
264
+
265
+ define i8 @test_cond_inv_and_invalid (i8 %x , i1 %c ) {
266
+ ; CHECK-LABEL: @test_cond_inv_and_invalid(
267
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
268
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[AND]], 0
269
+ ; CHECK-NEXT: [[COND:%.*]] = and i1 [[CMP]], [[C:%.*]]
270
+ ; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
271
+ ; CHECK: if:
272
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -4
273
+ ; CHECK-NEXT: ret i8 [[OR1]]
274
+ ; CHECK: exit:
275
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
276
+ ; CHECK-NEXT: ret i8 [[OR2]]
277
+ ;
278
+ %and = and i8 %x , 3
279
+ %cmp = icmp ne i8 %and , 0
280
+ %cond = and i1 %cmp , %c
281
+ br i1 %cond , label %if , label %exit
282
+
283
+ if:
284
+ %or1 = or i8 %x , -4
285
+ ret i8 %or1
286
+
287
+ exit:
288
+ %or2 = or i8 %x , -4
289
+ ret i8 %or2
290
+ }
291
+
292
+ declare void @use (i1 )
51
293
declare void @sink (i8 )
0 commit comments