@@ -343,5 +343,145 @@ exit:
343
343
ret i8 %or2
344
344
}
345
345
346
+ define i32 @test_icmp_trunc1 (i32 %x ){
347
+ ; CHECK-LABEL: @test_icmp_trunc1(
348
+ ; CHECK-NEXT: entry:
349
+ ; CHECK-NEXT: [[Y:%.*]] = trunc i32 [[X:%.*]] to i16
350
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[Y]], 7
351
+ ; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
352
+ ; CHECK: then:
353
+ ; CHECK-NEXT: ret i32 7
354
+ ; CHECK: else:
355
+ ; CHECK-NEXT: ret i32 0
356
+ ;
357
+ entry:
358
+ %y = trunc i32 %x to i16
359
+ %cmp = icmp eq i16 %y , 7
360
+ br i1 %cmp , label %then , label %else
361
+ then:
362
+ %z = and i32 %x , 15
363
+ ret i32 %z
364
+ else:
365
+ ret i32 0
366
+ }
367
+
368
+ define i32 @test_icmp_trunc_assume (i32 %x ){
369
+ ; CHECK-LABEL: @test_icmp_trunc_assume(
370
+ ; CHECK-NEXT: entry:
371
+ ; CHECK-NEXT: [[Y:%.*]] = trunc i32 [[X:%.*]] to i16
372
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[Y]], 7
373
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
374
+ ; CHECK-NEXT: ret i32 7
375
+ ;
376
+ entry:
377
+ %y = trunc i32 %x to i16
378
+ %cmp = icmp eq i16 %y , 7
379
+ call void @llvm.assume (i1 %cmp )
380
+ %z = and i32 %x , 15
381
+ ret i32 %z
382
+ }
383
+
384
+ define i64 @test_icmp_trunc2 (i64 %x ) {
385
+ ; CHECK-LABEL: @test_icmp_trunc2(
386
+ ; CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[X:%.*]] to i32
387
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[CONV]], 12
388
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
389
+ ; CHECK: if.then:
390
+ ; CHECK-NEXT: [[SEXT:%.*]] = and i64 [[X]], 2147483647
391
+ ; CHECK-NEXT: ret i64 [[SEXT]]
392
+ ; CHECK: if.else:
393
+ ; CHECK-NEXT: ret i64 0
394
+ ;
395
+ %conv = trunc i64 %x to i32
396
+ %cmp = icmp sgt i32 %conv , 12
397
+ br i1 %cmp , label %if.then , label %if.else
398
+
399
+ if.then:
400
+ %sext = shl i64 %x , 32
401
+ %ret = ashr exact i64 %sext , 32
402
+ ret i64 %ret
403
+ if.else:
404
+ ret i64 0
405
+ }
406
+
407
+ define i64 @test_icmp_trunc3 (i64 %n ) {
408
+ ; CHECK-LABEL: @test_icmp_trunc3(
409
+ ; CHECK-NEXT: entry:
410
+ ; CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[N:%.*]] to i32
411
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[CONV]], 96
412
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
413
+ ; CHECK: if.then:
414
+ ; CHECK-NEXT: [[RET:%.*]] = and i64 [[N]], 127
415
+ ; CHECK-NEXT: ret i64 [[RET]]
416
+ ; CHECK: if.else:
417
+ ; CHECK-NEXT: ret i64 0
418
+ ;
419
+ entry:
420
+ %conv = trunc i64 %n to i32
421
+ %cmp = icmp ult i32 %conv , 96
422
+ br i1 %cmp , label %if.then , label %if.else
423
+
424
+ if.then:
425
+ %ret = and i64 %n , 4294967295
426
+ ret i64 %ret
427
+
428
+ if.else:
429
+ ret i64 0
430
+ }
431
+
432
+ define i8 @test_icmp_trunc4 (i64 %n ) {
433
+ ; CHECK-LABEL: @test_icmp_trunc4(
434
+ ; CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[N:%.*]] to i32
435
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[CONV]], 10
436
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
437
+ ; CHECK: if.then:
438
+ ; CHECK-NEXT: [[CONV2:%.*]] = trunc i64 [[N]] to i8
439
+ ; CHECK-NEXT: [[ADD:%.*]] = or disjoint i8 [[CONV2]], 48
440
+ ; CHECK-NEXT: ret i8 [[ADD]]
441
+ ; CHECK: if.else:
442
+ ; CHECK-NEXT: ret i8 0
443
+ ;
444
+ %conv = trunc i64 %n to i32
445
+ %cmp = icmp ult i32 %conv , 10
446
+ br i1 %cmp , label %if.then , label %if.else
447
+
448
+ if.then:
449
+ %conv2 = trunc i64 %n to i8
450
+ %add = add i8 %conv2 , 48
451
+ ret i8 %add
452
+
453
+ if.else:
454
+ ret i8 0
455
+ }
456
+
457
+ define i64 @test_icmp_trunc5 (i64 %n ) {
458
+ ; CHECK-LABEL: @test_icmp_trunc5(
459
+ ; CHECK-NEXT: entry:
460
+ ; CHECK-NEXT: [[SHR:%.*]] = ashr i64 [[N:%.*]], 47
461
+ ; CHECK-NEXT: [[CONV1:%.*]] = trunc i64 [[SHR]] to i32
462
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[CONV1]], -13
463
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
464
+ ; CHECK: if.then:
465
+ ; CHECK-NEXT: [[TMP0:%.*]] = and i64 [[SHR]], 15
466
+ ; CHECK-NEXT: [[NOT:%.*]] = xor i64 [[TMP0]], 15
467
+ ; CHECK-NEXT: ret i64 [[NOT]]
468
+ ; CHECK: if.else:
469
+ ; CHECK-NEXT: ret i64 13
470
+ ;
471
+ entry:
472
+ %shr = ashr i64 %n , 47
473
+ %conv1 = trunc i64 %shr to i32
474
+ %cmp = icmp ugt i32 %conv1 , -13
475
+ br i1 %cmp , label %if.then , label %if.else
476
+
477
+ if.then:
478
+ %and = and i64 %shr , 4294967295
479
+ %not = xor i64 %and , 4294967295
480
+ ret i64 %not
481
+
482
+ if.else:
483
+ ret i64 13
484
+ }
485
+
346
486
declare void @use (i1 )
347
487
declare void @sink (i8 )
0 commit comments