@@ -125,6 +125,19 @@ static void EnumerateTwoInterestingConstantFPRanges(Fn TestFn) {
125
125
});
126
126
}
127
127
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
+
128
141
TEST_F (ConstantFPRangeTest, Basics) {
129
142
EXPECT_TRUE (Full.isFullSet ());
130
143
EXPECT_FALSE (Full.isEmptySet ());
@@ -323,23 +336,14 @@ TEST_F(ConstantFPRangeTest, FPClassify) {
323
336
324
337
EnumerateConstantFPRanges ([](const ConstantFPRange &CR) {
325
338
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
+ });
343
347
344
348
std::optional<bool > SignBit = std::nullopt;
345
349
if (HasPos != HasNeg)
0 commit comments