@@ -633,4 +633,65 @@ TEST_F(ConstantFPRangeTest, makeSatisfyingFCmpRegion) {
633633 }
634634}
635635
636+ TEST_F (ConstantFPRangeTest, fcmp) {
637+ std::vector<ConstantFPRange> InterestingRanges;
638+ const fltSemantics &Sem = APFloat::Float8E4M3 ();
639+ auto FpImm = [&](double V) {
640+ bool ignored;
641+ APFloat APF (V);
642+ APF.convert (Sem, APFloat::rmNearestTiesToEven, &ignored);
643+ return APF;
644+ };
645+
646+ InterestingRanges.push_back (ConstantFPRange::getEmpty (Sem));
647+ InterestingRanges.push_back (ConstantFPRange::getFull (Sem));
648+ InterestingRanges.push_back (ConstantFPRange::getFinite (Sem));
649+ InterestingRanges.push_back (ConstantFPRange (FpImm (1.0 )));
650+ InterestingRanges.push_back (
651+ ConstantFPRange (APFloat::getZero (Sem, /* Negative=*/ false )));
652+ InterestingRanges.push_back (
653+ ConstantFPRange (APFloat::getZero (Sem, /* Negative=*/ true )));
654+ InterestingRanges.push_back (
655+ ConstantFPRange (APFloat::getInf (Sem, /* Negative=*/ false )));
656+ InterestingRanges.push_back (
657+ ConstantFPRange (APFloat::getInf (Sem, /* Negative=*/ true )));
658+ InterestingRanges.push_back (
659+ ConstantFPRange (APFloat::getSmallest (Sem, /* Negative=*/ false )));
660+ InterestingRanges.push_back (
661+ ConstantFPRange (APFloat::getSmallest (Sem, /* Negative=*/ true )));
662+ InterestingRanges.push_back (
663+ ConstantFPRange (APFloat::getLargest (Sem, /* Negative=*/ false )));
664+ InterestingRanges.push_back (
665+ ConstantFPRange (APFloat::getLargest (Sem, /* Negative=*/ true )));
666+ InterestingRanges.push_back (
667+ ConstantFPRange::getNaNOnly (Sem, /* MayBeQNaN=*/ true , /* MayBeSNaN=*/ true ));
668+ InterestingRanges.push_back (
669+ ConstantFPRange::getNonNaN (FpImm (0.0 ), FpImm (1.0 )));
670+ InterestingRanges.push_back (
671+ ConstantFPRange::getNonNaN (FpImm (2.0 ), FpImm (3.0 )));
672+ InterestingRanges.push_back (
673+ ConstantFPRange::getNonNaN (FpImm (-1.0 ), FpImm (1.0 )));
674+ InterestingRanges.push_back (
675+ ConstantFPRange::getNonNaN (FpImm (-1.0 ), FpImm (-0.0 )));
676+ InterestingRanges.push_back (ConstantFPRange::getNonNaN (
677+ APFloat::getInf (Sem, /* Negative=*/ true ), FpImm (-1.0 )));
678+ InterestingRanges.push_back (ConstantFPRange::getNonNaN (
679+ FpImm (1.0 ), APFloat::getInf (Sem, /* Negative=*/ false )));
680+
681+ for (auto &LHS : InterestingRanges) {
682+ for (auto &RHS : InterestingRanges) {
683+ for (auto Pred : FCmpInst::predicates ()) {
684+ if (LHS.fcmp (Pred, RHS)) {
685+ EnumerateValuesInConstantFPRange (LHS, [&](const APFloat &LHSC) {
686+ EnumerateValuesInConstantFPRange (RHS, [&](const APFloat &RHSC) {
687+ EXPECT_TRUE (FCmpInst::compare (LHSC, RHSC, Pred))
688+ << LHS << " " << Pred << " " << RHS << " doesn't hold" ;
689+ });
690+ });
691+ }
692+ }
693+ }
694+ }
695+ }
696+
636697} // anonymous namespace
0 commit comments