@@ -284,5 +284,131 @@ exit:
284
284
ret i8 %or2
285
285
}
286
286
287
+ define i32 @test_icmp_trunc1 (i32 %x ){
288
+ ; CHECK-LABEL: @test_icmp_trunc1(
289
+ ; CHECK-NEXT: entry:
290
+ ; CHECK-NEXT: [[Y:%.*]] = trunc i32 [[X:%.*]] to i16
291
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[Y]], 7
292
+ ; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
293
+ ; CHECK: then:
294
+ ; CHECK-NEXT: [[Z:%.*]] = and i32 [[X]], 15
295
+ ; CHECK-NEXT: ret i32 [[Z]]
296
+ ; CHECK: else:
297
+ ; CHECK-NEXT: ret i32 0
298
+ ;
299
+ entry:
300
+ %y = trunc i32 %x to i16
301
+ %cmp = icmp eq i16 %y , 7
302
+ br i1 %cmp , label %then , label %else
303
+ then:
304
+ %z = and i32 %x , 15
305
+ ret i32 %z
306
+ else:
307
+ ret i32 0
308
+ }
309
+
310
+ define i64 @test_icmp_trunc2 (i64 %x ) {
311
+ ; CHECK-LABEL: @test_icmp_trunc2(
312
+ ; CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[X:%.*]] to i32
313
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[CONV]], 12
314
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
315
+ ; CHECK: if.then:
316
+ ; CHECK-NEXT: [[SEXT:%.*]] = shl i64 [[X]], 32
317
+ ; CHECK-NEXT: [[RET:%.*]] = ashr exact i64 [[SEXT]], 32
318
+ ; CHECK-NEXT: ret i64 [[RET]]
319
+ ; CHECK: if.else:
320
+ ; CHECK-NEXT: ret i64 0
321
+ ;
322
+ %conv = trunc i64 %x to i32
323
+ %cmp = icmp sgt i32 %conv , 12
324
+ br i1 %cmp , label %if.then , label %if.else
325
+
326
+ if.then:
327
+ %sext = shl i64 %x , 32
328
+ %ret = ashr exact i64 %sext , 32
329
+ ret i64 %ret
330
+ if.else:
331
+ ret i64 0
332
+ }
333
+
334
+ define i64 @test_icmp_trunc3 (i64 %n ) {
335
+ ; CHECK-LABEL: @test_icmp_trunc3(
336
+ ; CHECK-NEXT: entry:
337
+ ; CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[N:%.*]] to i32
338
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[CONV]], 96
339
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
340
+ ; CHECK: if.then:
341
+ ; CHECK-NEXT: [[RET:%.*]] = and i64 [[N]], 4294967295
342
+ ; CHECK-NEXT: ret i64 [[RET]]
343
+ ; CHECK: if.else:
344
+ ; CHECK-NEXT: ret i64 0
345
+ ;
346
+ entry:
347
+ %conv = trunc i64 %n to i32
348
+ %cmp = icmp ult i32 %conv , 96
349
+ br i1 %cmp , label %if.then , label %if.else
350
+
351
+ if.then:
352
+ %ret = and i64 %n , 4294967295
353
+ ret i64 %ret
354
+
355
+ if.else:
356
+ ret i64 0
357
+ }
358
+
359
+ define i8 @test_icmp_trunc4 (i64 %n ) {
360
+ ; CHECK-LABEL: @test_icmp_trunc4(
361
+ ; CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[N:%.*]] to i32
362
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[CONV]], 10
363
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
364
+ ; CHECK: if.then:
365
+ ; CHECK-NEXT: [[CONV2:%.*]] = trunc i64 [[N]] to i8
366
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[CONV2]], 48
367
+ ; CHECK-NEXT: ret i8 [[ADD]]
368
+ ; CHECK: if.else:
369
+ ; CHECK-NEXT: ret i8 0
370
+ ;
371
+ %conv = trunc i64 %n to i32
372
+ %cmp = icmp ult i32 %conv , 10
373
+ br i1 %cmp , label %if.then , label %if.else
374
+
375
+ if.then:
376
+ %conv2 = trunc i64 %n to i8
377
+ %add = add i8 %conv2 , 48
378
+ ret i8 %add
379
+
380
+ if.else:
381
+ ret i8 0
382
+ }
383
+
384
+ define i64 @test_icmp_trunc5 (i64 %n ) {
385
+ ; CHECK-LABEL: @test_icmp_trunc5(
386
+ ; CHECK-NEXT: entry:
387
+ ; CHECK-NEXT: [[SHR:%.*]] = ashr i64 [[N:%.*]], 47
388
+ ; CHECK-NEXT: [[CONV1:%.*]] = trunc i64 [[SHR]] to i32
389
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[CONV1]], -13
390
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
391
+ ; CHECK: if.then:
392
+ ; CHECK-NEXT: [[AND:%.*]] = and i64 [[SHR]], 4294967295
393
+ ; CHECK-NEXT: [[NOT:%.*]] = xor i64 [[AND]], 4294967295
394
+ ; CHECK-NEXT: ret i64 [[NOT]]
395
+ ; CHECK: if.else:
396
+ ; CHECK-NEXT: ret i64 13
397
+ ;
398
+ entry:
399
+ %shr = ashr i64 %n , 47
400
+ %conv1 = trunc i64 %shr to i32
401
+ %cmp = icmp ugt i32 %conv1 , -13
402
+ br i1 %cmp , label %if.then , label %if.else
403
+
404
+ if.then:
405
+ %and = and i64 %shr , 4294967295
406
+ %not = xor i64 %and , 4294967295
407
+ ret i64 %not
408
+
409
+ if.else:
410
+ ret i64 13
411
+ }
412
+
287
413
declare void @use (i1 )
288
414
declare void @sink (i8 )
0 commit comments