[ConstantRange] Respect destination bitwidth for cast results.

We returning a full set, we should use ResultBitWidth. Otherwise we might
it assertions when the resulting constant ranges are used later on.

Reviewers: nikic, spatel, reames

Reviewed By: nikic

Differential Revision: https://reviews.llvm.org/D71937
This commit is contained in:
Florian Hahn 2019-12-27 17:38:18 +00:00
parent 752220ea26
commit b35c585a9a
2 changed files with 24 additions and 2 deletions

View File

@ -641,7 +641,7 @@ ConstantRange ConstantRange::castOp(Instruction::CastOps CastOp,
if (getBitWidth() == ResultBitWidth)
return *this;
else
return getFull();
return getFull(ResultBitWidth);
case Instruction::UIToFP: {
// TODO: use input range if available
auto BW = getBitWidth();
@ -662,7 +662,7 @@ ConstantRange ConstantRange::castOp(Instruction::CastOps CastOp,
case Instruction::PtrToInt:
case Instruction::AddrSpaceCast:
// Conservatively return getFull set.
return getFull();
return getFull(ResultBitWidth);
};
}

View File

@ -2295,4 +2295,26 @@ TEST_F(ConstantRangeTest, Abs) {
});
}
TEST_F(ConstantRangeTest, castOps) {
ConstantRange A(APInt(16, 66), APInt(16, 128));
ConstantRange FpToI8 = A.castOp(Instruction::FPToSI, 8);
EXPECT_EQ(8u, FpToI8.getBitWidth());
EXPECT_TRUE(FpToI8.isFullSet());
ConstantRange FpToI16 = A.castOp(Instruction::FPToSI, 16);
EXPECT_EQ(16u, FpToI16.getBitWidth());
EXPECT_EQ(A, FpToI16);
ConstantRange FPExtToDouble = A.castOp(Instruction::FPExt, 64);
EXPECT_EQ(64u, FPExtToDouble.getBitWidth());
EXPECT_TRUE(FPExtToDouble.isFullSet());
ConstantRange PtrToInt = A.castOp(Instruction::PtrToInt, 64);
EXPECT_EQ(64u, PtrToInt.getBitWidth());
EXPECT_TRUE(PtrToInt.isFullSet());
ConstantRange IntToPtr = A.castOp(Instruction::IntToPtr, 64);
EXPECT_EQ(64u, IntToPtr.getBitWidth());
EXPECT_TRUE(IntToPtr.isFullSet());
}
} // anonymous namespace