@@ -451,6 +451,65 @@ TEST_F(ConstantRangeTest, Trunc) {
451451 EXPECT_EQ (SevenOne.truncate (2 ), ConstantRange (APInt (2 , 3 ), APInt (2 , 1 )));
452452}
453453
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+
454513TEST_F (ConstantRangeTest, ZExt) {
455514 ConstantRange ZFull = Full.zeroExtend (20 );
456515 ConstantRange ZEmpty = Empty.zeroExtend (20 );
0 commit comments