Index: lib/Analysis/ValueTracking.cpp =================================================================== --- lib/Analysis/ValueTracking.cpp +++ lib/Analysis/ValueTracking.cpp @@ -4397,12 +4397,34 @@ if (auto *C = dyn_cast(V)) return !C->isNaN(); + + if (auto *C = dyn_cast(V)) { + if (!C->getElementType()->isFloatingPointTy()) + return false; + for (unsigned I = 0, E = C->getNumElements(); I < E; ++I) { + if (C->getElementAsAPFloat(I).isNaN()) + return false; + } + return true; + } + return false; } static bool isKnownNonZero(const Value *V) { if (auto *C = dyn_cast(V)) return !C->isZero(); + + if (auto *C = dyn_cast(V)) { + if (!C->getElementType()->isFloatingPointTy()) + return false; + for (unsigned I = 0, E = C->getNumElements(); I < E; ++I) { + if (C->getElementAsAPFloat(I).isZero()) + return false; + } + return true; + } + return false; } Index: unittests/Analysis/ValueTrackingTest.cpp =================================================================== --- unittests/Analysis/ValueTrackingTest.cpp +++ unittests/Analysis/ValueTrackingTest.cpp @@ -77,6 +77,43 @@ expectPattern({SPF_FMINNUM, SPNB_RETURNS_NAN, false}); } +TEST_F(MatchSelectPatternTest, VectorFMin) { + parseAssembly( + "define <4 x float> @test(<4 x float> %a) {\n" + " %1 = fcmp ule <4 x float> %a, \n" + " \n" + " %A = select <4 x i1> %1, <4 x float> %a,\n" + " <4 x float> \n" + " ret <4 x float> %A\n" + "}\n"); + expectPattern({SPF_FMINNUM, SPNB_RETURNS_NAN, false}); +} + +TEST_F(MatchSelectPatternTest, VectorNotFMinNaN) { + parseAssembly( + "define <4 x float> @test(<4 x float> %a) {\n" + " %1 = fcmp ule <4 x float> %a, \n" + " \n" + " %A = select <4 x i1> %1, <4 x float> %a,\n" + " <4 x float> \n" + " ret <4 x float> %A\n" + "}\n"); + expectPattern({SPF_UNKNOWN, SPNB_NA, false}); +} + +TEST_F(MatchSelectPatternTest, VectorNotFMinZero) { + parseAssembly( + "define <4 x float> @test(<4 x float> %a) {\n" + " %1 = fcmp ule <4 x float> %a, \n" + " \n" + " %A = select <4 x i1> %1, <4 x float> %a,\n" + " <4 x float> \n" + " ret <4 x float> %A\n" + "}\n"); + expectPattern({SPF_UNKNOWN, SPNB_NA, false}); +} + TEST_F(MatchSelectPatternTest, SimpleFMax) { parseAssembly( "define float @test(float %a) {\n"