@@ -451,6 +451,65 @@ TEST_F(ConstantRangeTest, Trunc) {
451
451
EXPECT_EQ (SevenOne.truncate (2 ), ConstantRange (APInt (2 , 3 ), APInt (2 , 1 )));
452
452
}
453
453
454
+ TEST_F (ConstantRangeTest, TruncNuw) {
455
+ auto Range = [](unsigned NumBits, unsigned Lower, unsigned Upper) {
456
+ return ConstantRange (APInt (NumBits, Lower), APInt (NumBits, Upper));
457
+ };
458
+ // trunc([0, 4), 3->2) = full
459
+ EXPECT_TRUE (
460
+ Range (3 , 0 , 4 ).truncate (2 , TruncInst::NoUnsignedWrap).isFullSet ());
461
+ // trunc([0, 3), 3->2) = [0, 3)
462
+ EXPECT_EQ (Range (3 , 0 , 3 ).truncate (2 , TruncInst::NoUnsignedWrap),
463
+ Range (2 , 0 , 3 ));
464
+ // trunc([1, 3), 3->2) = [1, 3)
465
+ EXPECT_EQ (Range (3 , 1 , 3 ).truncate (2 , TruncInst::NoUnsignedWrap),
466
+ Range (2 , 1 , 3 ));
467
+ // trunc([1, 5), 3->2) = [1, 0)
468
+ EXPECT_EQ (Range (3 , 1 , 5 ).truncate (2 , TruncInst::NoUnsignedWrap),
469
+ Range (2 , 1 , 0 ));
470
+ // trunc([4, 7), 3->2) = empty
471
+ EXPECT_TRUE (
472
+ Range (3 , 4 , 7 ).truncate (2 , TruncInst::NoUnsignedWrap).isEmptySet ());
473
+ // trunc([4, 0), 3->2) = empty
474
+ EXPECT_TRUE (
475
+ Range (3 , 4 , 0 ).truncate (2 , TruncInst::NoUnsignedWrap).isEmptySet ());
476
+ // trunc([4, 1), 3->2) = [0, 1)
477
+ EXPECT_EQ (Range (3 , 4 , 1 ).truncate (2 , TruncInst::NoUnsignedWrap),
478
+ Range (2 , 0 , 1 ));
479
+ // trunc([3, 1), 3->2) = [3, 1)
480
+ EXPECT_EQ (Range (3 , 3 , 1 ).truncate (2 , TruncInst::NoUnsignedWrap),
481
+ Range (2 , 3 , 1 ));
482
+ // trunc([3, 0), 3->2) = [3, 0)
483
+ EXPECT_EQ (Range (3 , 3 , 0 ).truncate (2 , TruncInst::NoUnsignedWrap),
484
+ Range (2 , 3 , 0 ));
485
+ // trunc([1, 0), 2->1) = [1, 0)
486
+ EXPECT_EQ (Range (2 , 1 , 0 ).truncate (1 , TruncInst::NoUnsignedWrap),
487
+ Range (1 , 1 , 0 ));
488
+ // trunc([2, 1), 2->1) = [0, 1)
489
+ EXPECT_EQ (Range (2 , 2 , 1 ).truncate (1 , TruncInst::NoUnsignedWrap),
490
+ Range (1 , 0 , 1 ));
491
+ }
492
+
493
+ TEST_F (ConstantRangeTest, TruncNuwExhaustive) {
494
+ EnumerateConstantRanges (4 , [&](const ConstantRange &CR) {
495
+ unsigned NumBits = 3 ;
496
+ ConstantRange Trunc = CR.truncate (NumBits, TruncInst::NoUnsignedWrap);
497
+ SmallBitVector Elems (1 << NumBits);
498
+ ForeachNumInConstantRange (CR, [&](const APInt &N) {
499
+ if (N.isIntN (NumBits))
500
+ Elems.set (N.getZExtValue ());
501
+ });
502
+ TestRange (Trunc, Elems, PreferSmallest, {CR});
503
+ });
504
+ EnumerateConstantRanges (3 , [&](const ConstantRange &CR) {
505
+ ConstantRange Trunc = CR.truncate (1 , TruncInst::NoUnsignedWrap);
506
+ EXPECT_EQ (CR.contains (APInt::getZero (3 )),
507
+ Trunc.contains (APInt::getZero (1 )));
508
+ EXPECT_EQ (CR.contains (APInt::getOneBitSet (3 , 0 )),
509
+ Trunc.contains (APInt::getAllOnes (1 )));
510
+ });
511
+ }
512
+
454
513
TEST_F (ConstantRangeTest, ZExt) {
455
514
ConstantRange ZFull = Full.zeroExtend (20 );
456
515
ConstantRange ZEmpty = Empty.zeroExtend (20 );
0 commit comments