Skip to content

Commit 9beb4cd

Browse files
committed
[ConstantFPRange] Add EnumerateValuesInConstantFPRange
1 parent 1e0ac4c commit 9beb4cd

File tree

1 file changed

+21
-17
lines changed

1 file changed

+21
-17
lines changed

llvm/unittests/IR/ConstantFPRangeTest.cpp

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,19 @@ static void EnumerateTwoInterestingConstantFPRanges(Fn TestFn) {
125125
});
126126
}
127127

128+
template <typename Fn>
129+
static void EnumerateValuesInConstantFPRange(const ConstantFPRange &CR,
130+
Fn TestFn) {
131+
const fltSemantics &Sem = CR.getSemantics();
132+
unsigned Bits = APFloat::semanticsSizeInBits(Sem);
133+
assert(Bits < 32 && "Too many bits");
134+
for (unsigned I = 0, E = (1U << Bits) - 1; I != E; ++I) {
135+
APFloat V(Sem, APInt(Bits, I));
136+
if (CR.contains(V))
137+
TestFn(V);
138+
}
139+
}
140+
128141
TEST_F(ConstantFPRangeTest, Basics) {
129142
EXPECT_TRUE(Full.isFullSet());
130143
EXPECT_FALSE(Full.isEmptySet());
@@ -323,23 +336,14 @@ TEST_F(ConstantFPRangeTest, FPClassify) {
323336

324337
EnumerateConstantFPRanges([](const ConstantFPRange &CR) {
325338
unsigned Mask = fcNone;
326-
if (CR.containsSNaN())
327-
Mask |= fcSNan;
328-
if (CR.containsQNaN())
329-
Mask |= fcQNan;
330-
bool HasPos = CR.containsNaN(), HasNeg = CR.containsNaN();
331-
APFloat Lower = CR.getLower();
332-
const APFloat &Upper = CR.getUpper();
333-
if (!(Lower.isPosInfinity() && Upper.isNegInfinity())) {
334-
while (true) {
335-
Mask |= Lower.classify();
336-
HasPos |= !Lower.isNegative();
337-
HasNeg |= Lower.isNegative();
338-
if (Lower.bitwiseIsEqual(Upper))
339-
break;
340-
strictNext(Lower);
341-
}
342-
}
339+
bool HasPos = false, HasNeg = false;
340+
EnumerateValuesInConstantFPRange(CR, [&](const APFloat &V) {
341+
Mask |= V.classify();
342+
if (V.isNegative())
343+
HasNeg = true;
344+
else
345+
HasPos = true;
346+
});
343347

344348
std::optional<bool> SignBit = std::nullopt;
345349
if (HasPos != HasNeg)

0 commit comments

Comments
 (0)