@@ -214,4 +214,93 @@ define i1 @mul_constantexpr(i16 %a) {
214
214
ret i1 %cmp
215
215
}
216
216
217
+ define i1 @mul_nuw (i16 %x ) {
218
+ ; CHECK-LABEL: @mul_nuw(
219
+ ; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2
220
+ ; CHECK-NEXT: [[MUL:%.*]] = mul nuw i16 [[NZ]], 2
221
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[NZ]], [[MUL]]
222
+ ; CHECK-NEXT: ret i1 [[CMP]]
223
+ ;
224
+ %nz = or i16 %x , 2
225
+ %mul = mul nuw i16 %nz , 2
226
+ %cmp = icmp eq i16 %nz , %mul
227
+ ret i1 %cmp
228
+ }
229
+
230
+ define i1 @mul_nuw_comm (i16 %x ) {
231
+ ; CHECK-LABEL: @mul_nuw_comm(
232
+ ; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2
233
+ ; CHECK-NEXT: [[MUL:%.*]] = mul nuw i16 [[NZ]], 2
234
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[MUL]], [[NZ]]
235
+ ; CHECK-NEXT: ret i1 [[CMP]]
236
+ ;
237
+ %nz = or i16 %x , 2
238
+ %mul = mul nuw i16 %nz , 2
239
+ %cmp = icmp eq i16 %mul , %nz
240
+ ret i1 %cmp
241
+ }
242
+
243
+ define i1 @mul_nsw (i16 %x ) {
244
+ ; CHECK-LABEL: @mul_nsw(
245
+ ; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2
246
+ ; CHECK-NEXT: [[MUL:%.*]] = mul nsw i16 [[NZ]], 2
247
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[NZ]], [[MUL]]
248
+ ; CHECK-NEXT: ret i1 [[CMP]]
249
+ ;
250
+ %nz = or i16 %x , 2
251
+ %mul = mul nsw i16 %nz , 2
252
+ %cmp = icmp eq i16 %nz , %mul
253
+ ret i1 %cmp
254
+ }
255
+
256
+ define i1 @mul_nsw_comm (i16 %x ) {
257
+ ; CHECK-LABEL: @mul_nsw_comm(
258
+ ; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2
259
+ ; CHECK-NEXT: [[MUL:%.*]] = mul nsw i16 [[NZ]], 2
260
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[MUL]], [[NZ]]
261
+ ; CHECK-NEXT: ret i1 [[CMP]]
262
+ ;
263
+ %nz = or i16 %x , 2
264
+ %mul = mul nsw i16 %nz , 2
265
+ %cmp = icmp eq i16 %mul , %nz
266
+ ret i1 %cmp
267
+ }
268
+
269
+ define i1 @mul_may_wrap (i16 %x ) {
270
+ ; CHECK-LABEL: @mul_may_wrap(
271
+ ; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2
272
+ ; CHECK-NEXT: [[MUL:%.*]] = mul i16 [[NZ]], 2
273
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[NZ]], [[MUL]]
274
+ ; CHECK-NEXT: ret i1 [[CMP]]
275
+ ;
276
+ %nz = or i16 %x , 2
277
+ %mul = mul i16 %nz , 2
278
+ %cmp = icmp eq i16 %nz , %mul
279
+ ret i1 %cmp
280
+ }
281
+
282
+ define i1 @mul_may_be_zero (i16 %x ) {
283
+ ; CHECK-LABEL: @mul_may_be_zero(
284
+ ; CHECK-NEXT: [[MUL:%.*]] = mul nuw i16 [[X:%.*]], 2
285
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[X]], [[MUL]]
286
+ ; CHECK-NEXT: ret i1 [[CMP]]
287
+ ;
288
+ %mul = mul nuw i16 %x , 2
289
+ %cmp = icmp eq i16 %x , %mul
290
+ ret i1 %cmp
291
+ }
292
+
293
+ define i1 @mul_other_may_be_zero_or_one (i16 %x , i16 %y ) {
294
+ ; CHECK-LABEL: @mul_other_may_be_zero_or_one(
295
+ ; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2
296
+ ; CHECK-NEXT: [[MUL:%.*]] = mul nuw i16 [[NZ]], [[Y:%.*]]
297
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[NZ]], [[MUL]]
298
+ ; CHECK-NEXT: ret i1 [[CMP]]
299
+ ;
300
+ %nz = or i16 %x , 2
301
+ %mul = mul nuw i16 %nz , %y
302
+ %cmp = icmp eq i16 %nz , %mul
303
+ ret i1 %cmp
304
+ }
305
+
217
306
!0 = !{ i8 1 , i8 5 }
0 commit comments