1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 12:43:36 +01:00

Multiply was very wrong for wrapped ranges. This supplies a half-fix that will

generally return Full on all wrapped inputs. "Fixes" PR4545.

llvm-svn: 75444
This commit is contained in:
Nick Lewycky 2009-07-13 03:27:41 +00:00
parent 7280c39dc7
commit fee90bcb80
2 changed files with 11 additions and 6 deletions

View File

@ -557,13 +557,13 @@ ConstantRange::multiply(const ConstantRange &Other) const {
if (isFullSet() || Other.isFullSet())
return ConstantRange(getBitWidth(), /*isFullSet=*/true);
ConstantRange this_zext = zeroExtend(getBitWidth() * 2);
ConstantRange Other_zext = Other.zeroExtend(getBitWidth() * 2);
ConstantRange Result_zext = ConstantRange(
this_zext.getLower() * Other_zext.getLower(),
((this_zext.getUpper()-1) * (Other_zext.getUpper()-1)) + 1);
APInt this_min = getUnsignedMin().zext(getBitWidth() * 2);
APInt this_max = getUnsignedMax().zext(getBitWidth() * 2);
APInt Other_min = Other.getUnsignedMin().zext(getBitWidth() * 2);
APInt Other_max = Other.getUnsignedMax().zext(getBitWidth() * 2);
ConstantRange Result_zext = ConstantRange(this_min * Other_min,
this_max * Other_max + 1);
return Result_zext.truncate(getBitWidth());
}

View File

@ -275,6 +275,11 @@ TEST_F(ConstantRangeTest, Multiply) {
EXPECT_TRUE(Some.multiply(Some).isFullSet());
EXPECT_EQ(Some.multiply(Wrap), Full);
EXPECT_EQ(Wrap.multiply(Wrap), Full);
// http://llvm.org/PR4545
EXPECT_EQ(ConstantRange(APInt(4, 1), APInt(4, 6)).multiply(
ConstantRange(APInt(4, 6), APInt(4, 2))),
ConstantRange(4, /*isFullSet=*/true));
}
TEST_F(ConstantRangeTest, UMax) {