Skip to content

Commit 8cd76c1

Browse files
committed
[ConstantFPRange] Add an edge case
1 parent 838b145 commit 8cd76c1

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
@@ -398,10 +398,12 @@ ConstantFPRange ConstantFPRange::cast(const fltSemantics &DstSem) const {
398398
APFloat NewUpper = Upper;
399399
// For conservative, return full range if conversion is invalid.
400400
if (NewLower.convert(DstSem, APFloat::rmNearestTiesToEven, &LosesInfo) ==
401-
APFloat::opInvalidOp)
401+
APFloat::opInvalidOp ||
402+
NewLower.isNaN())
402403
return getFull(DstSem);
403404
if (NewUpper.convert(DstSem, APFloat::rmNearestTiesToEven, &LosesInfo) ==
404-
APFloat::opInvalidOp)
405+
APFloat::opInvalidOp ||
406+
NewUpper.isNaN())
405407
return getFull(DstSem);
406408
return ConstantFPRange(std::move(NewLower), std::move(NewUpper),
407409
/*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"
@@ -771,6 +772,7 @@ TEST_F(ConstantFPRangeTest, cast) {
771772
const fltSemantics &F16Sem = APFloat::IEEEhalf();
772773
const fltSemantics &BF16Sem = APFloat::BFloat();
773774
const fltSemantics &F32Sem = APFloat::IEEEsingle();
775+
const fltSemantics &F8NanOnlySem = APFloat::Float8E4M3FN();
774776
// normal -> normal (exact)
775777
EXPECT_EQ(ConstantFPRange::getNonNaN(APFloat(1.0), APFloat(2.0)).cast(F32Sem),
776778
ConstantFPRange::getNonNaN(APFloat(1.0f), APFloat(2.0f)));
@@ -821,6 +823,11 @@ TEST_F(ConstantFPRangeTest, cast) {
821823
.cast(F32Sem),
822824
ConstantFPRange::getNaNOnly(F32Sem, /*MayBeQNaN=*/true,
823825
/*MayBeSNaN=*/false));
826+
// inf -> nan only (return full set for now)
827+
EXPECT_EQ(ConstantFPRange::getNonNaN(APFloat::getInf(Sem, /*Negative=*/true),
828+
APFloat::getInf(Sem, /*Negative=*/false))
829+
.cast(F8NanOnlySem),
830+
ConstantFPRange::getFull(F8NanOnlySem));
824831

825832
EnumerateValuesInConstantFPRange(
826833
ConstantFPRange::getFull(APFloat::Float8E4M3()),

0 commit comments

Comments
 (0)