diff options
| author | 2018-04-06 14:26:03 +0000 | |
|---|---|---|
| committer | 2018-04-06 14:26:03 +0000 | |
| commit | bdabc2f19ffb9e20600dad6e8a300842a7bda50e (patch) | |
| tree | c50e7b2e5449b074651bb82a58517a8ebc4a8cf7 /gnu/llvm/unittests/IR/ConstantRangeTest.cpp | |
| parent | Print a 'p' flag for file descriptors that were opened after pledge(2). (diff) | |
| download | wireguard-openbsd-bdabc2f19ffb9e20600dad6e8a300842a7bda50e.tar.xz wireguard-openbsd-bdabc2f19ffb9e20600dad6e8a300842a7bda50e.zip | |
Import LLVM 6.0.1 release including clang, lld and lldb.
"where is the kaboom?" deraadt@
Diffstat (limited to 'gnu/llvm/unittests/IR/ConstantRangeTest.cpp')
| -rw-r--r-- | gnu/llvm/unittests/IR/ConstantRangeTest.cpp | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/gnu/llvm/unittests/IR/ConstantRangeTest.cpp b/gnu/llvm/unittests/IR/ConstantRangeTest.cpp index 0292f60fe33..351256d4993 100644 --- a/gnu/llvm/unittests/IR/ConstantRangeTest.cpp +++ b/gnu/llvm/unittests/IR/ConstantRangeTest.cpp @@ -606,6 +606,33 @@ TEST_F(ConstantRangeTest, Lshr) { EXPECT_EQ(Wrap.lshr(Wrap), Full); } +TEST_F(ConstantRangeTest, Ashr) { + EXPECT_EQ(Full.ashr(Full), Full); + EXPECT_EQ(Full.ashr(Empty), Empty); + EXPECT_EQ(Full.ashr(One), ConstantRange(APInt(16, 0xffe0), + APInt(16, (0x7fff >> 0xa) + 1 ))); + ConstantRange Small(APInt(16, 0xa), APInt(16, 0xb)); + EXPECT_EQ(Full.ashr(Small), ConstantRange(APInt(16, 0xffe0), + APInt(16, (0x7fff >> 0xa) + 1 ))); + EXPECT_EQ(Full.ashr(Some), ConstantRange(APInt(16, 0xffe0), + APInt(16, (0x7fff >> 0xa) + 1 ))); + EXPECT_EQ(Full.ashr(Wrap), Full); + EXPECT_EQ(Empty.ashr(Empty), Empty); + EXPECT_EQ(Empty.ashr(One), Empty); + EXPECT_EQ(Empty.ashr(Some), Empty); + EXPECT_EQ(Empty.ashr(Wrap), Empty); + EXPECT_EQ(One.ashr(One), ConstantRange(APInt(16, 0))); + EXPECT_EQ(One.ashr(Some), ConstantRange(APInt(16, 0))); + EXPECT_EQ(One.ashr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb))); + EXPECT_EQ(Some.ashr(Some), ConstantRange(APInt(16, 0), + APInt(16, (0xaaa >> 0xa) + 1))); + EXPECT_EQ(Some.ashr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa))); + EXPECT_EQ(Wrap.ashr(Wrap), Full); + ConstantRange Neg(APInt(16, 0xf3f0, true), APInt(16, 0xf7f8, true)); + EXPECT_EQ(Neg.ashr(Small), ConstantRange(APInt(16, 0xfffc, true), + APInt(16, 0xfffe, true))); +} + TEST(ConstantRange, MakeAllowedICmpRegion) { // PR8250 ConstantRange SMax = ConstantRange(APInt::getSignedMaxValue(32)); @@ -715,24 +742,102 @@ TEST(ConstantRange, MakeGuaranteedNoWrapRegion) { } } + for (int Const : {0, -1, -2, 1, 2, IntMin4Bits, IntMax4Bits}) { + APInt C(4, Const, true /* = isSigned */); + + auto NUWRegion = ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, C, OBO::NoUnsignedWrap); + + EXPECT_FALSE(NUWRegion.isEmptySet()); + + auto NSWRegion = ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, C, OBO::NoSignedWrap); + + EXPECT_FALSE(NSWRegion.isEmptySet()); + + auto NoWrapRegion = ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, C, OBO::NoSignedWrap | OBO::NoUnsignedWrap); + + EXPECT_FALSE(NoWrapRegion.isEmptySet()); + EXPECT_TRUE(NUWRegion.intersectWith(NSWRegion).contains(NoWrapRegion)); + + for (APInt I = NUWRegion.getLower(), E = NUWRegion.getUpper(); I != E; + ++I) { + bool Overflow = false; + (void)I.usub_ov(C, Overflow); + EXPECT_FALSE(Overflow); + } + + for (APInt I = NSWRegion.getLower(), E = NSWRegion.getUpper(); I != E; + ++I) { + bool Overflow = false; + (void)I.ssub_ov(C, Overflow); + EXPECT_FALSE(Overflow); + } + + for (APInt I = NoWrapRegion.getLower(), E = NoWrapRegion.getUpper(); I != E; + ++I) { + bool Overflow = false; + + (void)I.ssub_ov(C, Overflow); + EXPECT_FALSE(Overflow); + + (void)I.usub_ov(C, Overflow); + EXPECT_FALSE(Overflow); + } + } + auto NSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion( Instruction::Add, ConstantRange(32, /* isFullSet = */ true), OBO::NoSignedWrap); EXPECT_TRUE(NSWForAllValues.isSingleElement() && NSWForAllValues.getSingleElement()->isMinValue()); + NSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, ConstantRange(32, /* isFullSet = */ true), + OBO::NoSignedWrap); + EXPECT_TRUE(NSWForAllValues.isSingleElement() && + NSWForAllValues.getSingleElement()->isMaxValue()); + auto NUWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion( Instruction::Add, ConstantRange(32, /* isFullSet = */ true), OBO::NoUnsignedWrap); EXPECT_TRUE(NUWForAllValues.isSingleElement() && NUWForAllValues.getSingleElement()->isMinValue()); + NUWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, ConstantRange(32, /* isFullSet = */ true), + OBO::NoUnsignedWrap); + EXPECT_TRUE(NUWForAllValues.isSingleElement() && + NUWForAllValues.getSingleElement()->isMaxValue()); + auto NUWAndNSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion( Instruction::Add, ConstantRange(32, /* isFullSet = */ true), OBO::NoUnsignedWrap | OBO::NoSignedWrap); EXPECT_TRUE(NUWAndNSWForAllValues.isSingleElement() && NUWAndNSWForAllValues.getSingleElement()->isMinValue()); + NUWAndNSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, ConstantRange(32, /* isFullSet = */ true), + OBO::NoUnsignedWrap | OBO::NoSignedWrap); + EXPECT_TRUE(NUWAndNSWForAllValues.isSingleElement() && + NUWAndNSWForAllValues.getSingleElement()->isMaxValue()); + + EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Add, APInt(32, 0), OBO::NoUnsignedWrap).isFullSet()); + EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Add, APInt(32, 0), OBO::NoSignedWrap).isFullSet()); + EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Add, APInt(32, 0), + OBO::NoUnsignedWrap | OBO::NoSignedWrap).isFullSet()); + EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, APInt(32, 0), OBO::NoUnsignedWrap).isFullSet()); + EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, APInt(32, 0), OBO::NoSignedWrap).isFullSet()); + EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, APInt(32, 0), + OBO::NoUnsignedWrap | OBO::NoSignedWrap).isFullSet()); + ConstantRange OneToFive(APInt(32, 1), APInt(32, 6)); EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion( Instruction::Add, OneToFive, OBO::NoSignedWrap), @@ -745,6 +850,17 @@ TEST(ConstantRange, MakeGuaranteedNoWrapRegion) { ConstantRange::makeGuaranteedNoWrapRegion( Instruction::Add, OneToFive, OBO::NoUnsignedWrap | OBO::NoSignedWrap), ConstantRange(APInt::getMinValue(32), APInt::getSignedMaxValue(32) - 4)); + EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, OneToFive, OBO::NoSignedWrap), + ConstantRange(APInt::getSignedMinValue(32) + 5, + APInt::getSignedMinValue(32))); + EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, OneToFive, OBO::NoUnsignedWrap), + ConstantRange(APInt::getMinValue(32) + 5, APInt::getMinValue(32))); + EXPECT_EQ( + ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, OneToFive, OBO::NoUnsignedWrap | OBO::NoSignedWrap), + ConstantRange(APInt::getMinValue(32) + 5, APInt::getSignedMinValue(32))); ConstantRange MinusFiveToMinusTwo(APInt(32, -5), APInt(32, -1)); EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion( @@ -758,6 +874,19 @@ TEST(ConstantRange, MakeGuaranteedNoWrapRegion) { Instruction::Add, MinusFiveToMinusTwo, OBO::NoUnsignedWrap | OBO::NoSignedWrap), ConstantRange(APInt(32, 0), APInt(32, 2))); + EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, MinusFiveToMinusTwo, OBO::NoSignedWrap), + ConstantRange(APInt::getSignedMinValue(32), + APInt::getSignedMaxValue(32) - 4)); + EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, MinusFiveToMinusTwo, OBO::NoUnsignedWrap), + ConstantRange(APInt::getMaxValue(32) - 1, + APInt::getMinValue(32))); + EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, MinusFiveToMinusTwo, + OBO::NoUnsignedWrap | OBO::NoSignedWrap), + ConstantRange(APInt::getMaxValue(32) - 1, + APInt::getMinValue(32))); ConstantRange MinusOneToOne(APInt(32, -1), APInt(32, 2)); EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion( @@ -771,6 +900,43 @@ TEST(ConstantRange, MakeGuaranteedNoWrapRegion) { Instruction::Add, MinusOneToOne, OBO::NoUnsignedWrap | OBO::NoSignedWrap), ConstantRange(APInt(32, 0), APInt(32, 1))); + EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, MinusOneToOne, OBO::NoSignedWrap), + ConstantRange(APInt::getSignedMinValue(32) + 1, + APInt::getSignedMinValue(32) - 1)); + EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, MinusOneToOne, OBO::NoUnsignedWrap), + ConstantRange(APInt::getMaxValue(32), + APInt::getMinValue(32))); + EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, MinusOneToOne, + OBO::NoUnsignedWrap | OBO::NoSignedWrap), + ConstantRange(APInt::getMaxValue(32), + APInt::getMinValue(32))); + + ConstantRange One(APInt(32, 1), APInt(32, 2)); + EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Add, One, OBO::NoSignedWrap), + ConstantRange(APInt::getSignedMinValue(32), + APInt::getSignedMaxValue(32))); + EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Add, One, OBO::NoUnsignedWrap), + ConstantRange(APInt::getMinValue(32), APInt::getMaxValue(32))); + EXPECT_EQ( + ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Add, One, OBO::NoUnsignedWrap | OBO::NoSignedWrap), + ConstantRange(APInt(32, 0), APInt::getSignedMaxValue(32))); + EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, One, OBO::NoSignedWrap), + ConstantRange(APInt::getSignedMinValue(32) + 1, + APInt::getSignedMinValue(32))); + EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, One, OBO::NoUnsignedWrap), + ConstantRange(APInt::getMinValue(32) + 1, APInt::getMinValue(32))); + EXPECT_EQ( + ConstantRange::makeGuaranteedNoWrapRegion( + Instruction::Sub, One, OBO::NoUnsignedWrap | OBO::NoSignedWrap), + ConstantRange(APInt::getMinValue(32) + 1, APInt::getSignedMinValue(32))); } TEST(ConstantRange, GetEquivalentICmp) { |
