Skip to content

Commit cc0000b

Browse files
committed
[ConstantFPRange] Add an edge case
1 parent 08d300f commit cc0000b

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

llvm/lib/IR/ConstantFPRange.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -432,10 +432,12 @@ ConstantFPRange ConstantFPRange::cast(const fltSemantics &DstSem) const {
432432
APFloat NewUpper = Upper;
433433
// For conservative, return full range if conversion is invalid.
434434
if (NewLower.convert(DstSem, APFloat::rmNearestTiesToEven, &LosesInfo) ==
435-
APFloat::opInvalidOp)
435+
APFloat::opInvalidOp ||
436+
NewLower.isNaN())
436437
return getFull(DstSem);
437438
if (NewUpper.convert(DstSem, APFloat::rmNearestTiesToEven, &LosesInfo) ==
438-
APFloat::opInvalidOp)
439+
APFloat::opInvalidOp ||
440+
NewUpper.isNaN())
439441
return getFull(DstSem);
440442
return ConstantFPRange(std::move(NewLower), std::move(NewUpper),
441443
/*MayBeQNaNVal=*/MayBeQNaN || MayBeSNaN,

llvm/unittests/IR/ConstantFPRangeTest.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "llvm/IR/ConstantFPRange.h"
10+
#include "llvm/ADT/APFloat.h"
1011
#include "llvm/IR/Instructions.h"
1112
#include "llvm/IR/Operator.h"
1213
#include "gtest/gtest.h"
@@ -822,6 +823,7 @@ TEST_F(ConstantFPRangeTest, cast) {
822823
const fltSemantics &F16Sem = APFloat::IEEEhalf();
823824
const fltSemantics &BF16Sem = APFloat::BFloat();
824825
const fltSemantics &F32Sem = APFloat::IEEEsingle();
826+
const fltSemantics &F8NanOnlySem = APFloat::Float8E4M3FN();
825827
// normal -> normal (exact)
826828
EXPECT_EQ(ConstantFPRange::getNonNaN(APFloat(1.0), APFloat(2.0)).cast(F32Sem),
827829
ConstantFPRange::getNonNaN(APFloat(1.0f), APFloat(2.0f)));
@@ -872,6 +874,11 @@ TEST_F(ConstantFPRangeTest, cast) {
872874
.cast(F32Sem),
873875
ConstantFPRange::getNaNOnly(F32Sem, /*MayBeQNaN=*/true,
874876
/*MayBeSNaN=*/false));
877+
// inf -> nan only (return full set for now)
878+
EXPECT_EQ(ConstantFPRange::getNonNaN(APFloat::getInf(Sem, /*Negative=*/true),
879+
APFloat::getInf(Sem, /*Negative=*/false))
880+
.cast(F8NanOnlySem),
881+
ConstantFPRange::getFull(F8NanOnlySem));
875882

876883
EnumerateValuesInConstantFPRange(
877884
ConstantFPRange::getFull(APFloat::Float8E4M3()),

0 commit comments

Comments
 (0)