Skip to content

Commit faa76dc

Browse files
committed
[ConstantFPRange] Add rounding mode parameter
1 parent 8cd76c1 commit faa76dc

File tree

3 files changed

+33
-7
lines changed

3 files changed

+33
-7
lines changed

llvm/include/llvm/IR/ConstantFPRange.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,11 @@ class [[nodiscard]] ConstantFPRange {
201201
/// elements of both sets, but may contain more.
202202
LLVM_ABI ConstantFPRange unionWith(const ConstantFPRange &CR) const;
203203

204-
/// Return a new range in the specified format.
205-
LLVM_ABI ConstantFPRange cast(const fltSemantics &DstSem) const;
204+
/// Return a new range in the specified format with the specified rounding
205+
/// mode.
206+
LLVM_ABI ConstantFPRange
207+
cast(const fltSemantics &DstSem,
208+
APFloat::roundingMode RM = APFloat::rmNearestTiesToEven) const;
206209
};
207210

208211
inline raw_ostream &operator<<(raw_ostream &OS, const ConstantFPRange &CR) {

llvm/lib/IR/ConstantFPRange.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,8 @@ std::optional<bool> ConstantFPRange::getSignBit() const {
326326
}
327327

328328
bool ConstantFPRange::operator==(const ConstantFPRange &CR) const {
329+
assert(&getSemantics() == &CR.getSemantics() &&
330+
"Should only use the same semantics");
329331
if (MayBeSNaN != CR.MayBeSNaN || MayBeQNaN != CR.MayBeQNaN)
330332
return false;
331333
return Lower.bitwiseIsEqual(CR.Lower) && Upper.bitwiseIsEqual(CR.Upper);
@@ -392,17 +394,16 @@ ConstantFPRange ConstantFPRange::unionWith(const ConstantFPRange &CR) const {
392394
MayBeQNaN | CR.MayBeQNaN, MayBeSNaN | CR.MayBeSNaN);
393395
}
394396

395-
ConstantFPRange ConstantFPRange::cast(const fltSemantics &DstSem) const {
397+
ConstantFPRange ConstantFPRange::cast(const fltSemantics &DstSem,
398+
APFloat::roundingMode RM) const {
396399
bool LosesInfo;
397400
APFloat NewLower = Lower;
398401
APFloat NewUpper = Upper;
399402
// For conservative, return full range if conversion is invalid.
400-
if (NewLower.convert(DstSem, APFloat::rmNearestTiesToEven, &LosesInfo) ==
401-
APFloat::opInvalidOp ||
403+
if (NewLower.convert(DstSem, RM, &LosesInfo) == APFloat::opInvalidOp ||
402404
NewLower.isNaN())
403405
return getFull(DstSem);
404-
if (NewUpper.convert(DstSem, APFloat::rmNearestTiesToEven, &LosesInfo) ==
405-
APFloat::opInvalidOp ||
406+
if (NewUpper.convert(DstSem, RM, &LosesInfo) == APFloat::opInvalidOp ||
406407
NewUpper.isNaN())
407408
return getFull(DstSem);
408409
return ConstantFPRange(std::move(NewLower), std::move(NewUpper),

llvm/unittests/IR/ConstantFPRangeTest.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -828,6 +828,28 @@ TEST_F(ConstantFPRangeTest, cast) {
828828
APFloat::getInf(Sem, /*Negative=*/false))
829829
.cast(F8NanOnlySem),
830830
ConstantFPRange::getFull(F8NanOnlySem));
831+
// other rounding modes
832+
EXPECT_EQ(
833+
ConstantFPRange::getNonNaN(APFloat::getSmallest(Sem, /*Negative=*/true),
834+
APFloat::getSmallest(Sem, /*Negative=*/false))
835+
.cast(F32Sem, APFloat::rmTowardNegative),
836+
ConstantFPRange::getNonNaN(
837+
APFloat::getSmallest(F32Sem, /*Negative=*/true),
838+
APFloat::getZero(F32Sem, /*Negative=*/false)));
839+
EXPECT_EQ(
840+
ConstantFPRange::getNonNaN(APFloat::getSmallest(Sem, /*Negative=*/true),
841+
APFloat::getSmallest(Sem, /*Negative=*/false))
842+
.cast(F32Sem, APFloat::rmTowardPositive),
843+
ConstantFPRange::getNonNaN(
844+
APFloat::getZero(F32Sem, /*Negative=*/true),
845+
APFloat::getSmallest(F32Sem, /*Negative=*/false)));
846+
EXPECT_EQ(
847+
ConstantFPRange::getNonNaN(
848+
APFloat::getSmallestNormalized(Sem, /*Negative=*/true),
849+
APFloat::getSmallestNormalized(Sem, /*Negative=*/false))
850+
.cast(F32Sem, APFloat::rmTowardZero),
851+
ConstantFPRange::getNonNaN(APFloat::getZero(F32Sem, /*Negative=*/true),
852+
APFloat::getZero(F32Sem, /*Negative=*/false)));
831853

832854
EnumerateValuesInConstantFPRange(
833855
ConstantFPRange::getFull(APFloat::Float8E4M3()),

0 commit comments

Comments
 (0)