[llvm] 06f9420 - ValueTracking: Ignore -0 for nsz sqrt with UseInstrInfo in computeKnownFPClass
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 20 18:30:14 PDT 2023
Author: Matt Arsenault
Date: 2023-06-20T21:30:09-04:00
New Revision: 06f942016b6b1e376334937a3b132232e311104f
URL: https://github.com/llvm/llvm-project/commit/06f942016b6b1e376334937a3b132232e311104f
DIFF: https://github.com/llvm/llvm-project/commit/06f942016b6b1e376334937a3b132232e311104f.diff
LOG: ValueTracking: Ignore -0 for nsz sqrt with UseInstrInfo in computeKnownFPClass
This avoids a regression when SignBitMustBeZero is moved to computeKnownFPClass.
Added:
Modified:
llvm/include/llvm/Analysis/InstructionSimplify.h
llvm/lib/Analysis/ValueTracking.cpp
llvm/unittests/Analysis/ValueTrackingTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Analysis/InstructionSimplify.h b/llvm/include/llvm/Analysis/InstructionSimplify.h
index c3a9c20719cd9..df0784664eadc 100644
--- a/llvm/include/llvm/Analysis/InstructionSimplify.h
+++ b/llvm/include/llvm/Analysis/InstructionSimplify.h
@@ -83,6 +83,12 @@ struct InstrInfoQuery {
return cast<PossiblyExactOperator>(Op)->isExact();
return false;
}
+
+ template <class InstT> bool hasNoSignedZeros(const InstT *Op) const {
+ if (UseInstrInfo)
+ return Op->hasNoSignedZeros();
+ return false;
+ }
};
struct SimplifyQuery {
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 88ed92e031892..66e810ce634d3 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -4469,7 +4469,8 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
// If the input denormal mode could be PreserveSign, a negative
// subnormal input could produce a negative zero output.
const Function *F = II->getFunction();
- if (F && KnownSrc.isKnownNeverLogicalNegZero(*F, II->getType())) {
+ if (Q.IIQ.hasNoSignedZeros(II) ||
+ (F && KnownSrc.isKnownNeverLogicalNegZero(*F, II->getType()))) {
Known.knownNot(fcNegZero);
if (KnownSrc.isKnownNeverNaN())
Known.SignBit = false;
diff --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp
index f8910ea21e6ec..5cc76e2f7c22f 100644
--- a/llvm/unittests/Analysis/ValueTrackingTest.cpp
+++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp
@@ -1890,6 +1890,80 @@ TEST_F(ComputeKnownFPClassTest, FCmpToClassTest_PInf) {
EXPECT_EQ(fcNone, UgtClass);
}
+TEST_F(ComputeKnownFPClassTest, SqrtNszSignBit) {
+ parseAssembly(
+ "declare float @llvm.sqrt.f32(float)\n"
+ "define float @test(float %arg, float nofpclass(nan) %arg.nnan) {\n"
+ " %A = call float @llvm.sqrt.f32(float %arg)\n"
+ " %A2 = call nsz float @llvm.sqrt.f32(float %arg)\n"
+ " %A3 = call float @llvm.sqrt.f32(float %arg.nnan)\n"
+ " %A4 = call nsz float @llvm.sqrt.f32(float %arg.nnan)\n"
+ " ret float %A\n"
+ "}\n");
+
+ const FPClassTest SqrtMask = fcPositive | fcNegZero | fcNan;
+ const FPClassTest NszSqrtMask = fcPositive | fcNan;
+
+ {
+ KnownFPClass UseInstrInfo =
+ computeKnownFPClass(A, M->getDataLayout(), fcAllFlags, 0, nullptr,
+ nullptr, nullptr, nullptr, /*UseInstrInfo=*/true);
+ EXPECT_EQ(SqrtMask, UseInstrInfo.KnownFPClasses);
+ EXPECT_EQ(std::nullopt, UseInstrInfo.SignBit);
+
+ KnownFPClass NoUseInstrInfo =
+ computeKnownFPClass(A, M->getDataLayout(), fcAllFlags, 0, nullptr,
+ nullptr, nullptr, nullptr, /*UseInstrInfo=*/false);
+ EXPECT_EQ(SqrtMask, NoUseInstrInfo.KnownFPClasses);
+ EXPECT_EQ(std::nullopt, NoUseInstrInfo.SignBit);
+ }
+
+ {
+ KnownFPClass UseInstrInfoNSZ =
+ computeKnownFPClass(A2, M->getDataLayout(), fcAllFlags, 0, nullptr,
+ nullptr, nullptr, nullptr, /*UseInstrInfo=*/true);
+ EXPECT_EQ(NszSqrtMask, UseInstrInfoNSZ.KnownFPClasses);
+ EXPECT_EQ(std::nullopt, UseInstrInfoNSZ.SignBit);
+
+ KnownFPClass NoUseInstrInfoNSZ =
+ computeKnownFPClass(A2, M->getDataLayout(), fcAllFlags, 0, nullptr,
+ nullptr, nullptr, nullptr, /*UseInstrInfo=*/false);
+ EXPECT_EQ(SqrtMask, NoUseInstrInfoNSZ.KnownFPClasses);
+ EXPECT_EQ(std::nullopt, NoUseInstrInfoNSZ.SignBit);
+ }
+
+ {
+ KnownFPClass UseInstrInfoNoNan =
+ computeKnownFPClass(A3, M->getDataLayout(), fcAllFlags, 0, nullptr,
+ nullptr, nullptr, nullptr, /*UseInstrInfo=*/true);
+ EXPECT_EQ(fcPositive | fcNegZero | fcQNan,
+ UseInstrInfoNoNan.KnownFPClasses);
+ EXPECT_EQ(std::nullopt, UseInstrInfoNoNan.SignBit);
+
+ KnownFPClass NoUseInstrInfoNoNan =
+ computeKnownFPClass(A3, M->getDataLayout(), fcAllFlags, 0, nullptr,
+ nullptr, nullptr, nullptr, /*UseInstrInfo=*/false);
+ EXPECT_EQ(fcPositive | fcNegZero | fcQNan,
+ NoUseInstrInfoNoNan.KnownFPClasses);
+ EXPECT_EQ(std::nullopt, NoUseInstrInfoNoNan.SignBit);
+ }
+
+ {
+ KnownFPClass UseInstrInfoNSZNoNan =
+ computeKnownFPClass(A4, M->getDataLayout(), fcAllFlags, 0, nullptr,
+ nullptr, nullptr, nullptr, /*UseInstrInfo=*/true);
+ EXPECT_EQ(fcPositive | fcQNan, UseInstrInfoNSZNoNan.KnownFPClasses);
+ EXPECT_EQ(false, UseInstrInfoNSZNoNan.SignBit);
+
+ KnownFPClass NoUseInstrInfoNSZNoNan =
+ computeKnownFPClass(A4, M->getDataLayout(), fcAllFlags, 0, nullptr,
+ nullptr, nullptr, nullptr, /*UseInstrInfo=*/false);
+ EXPECT_EQ(fcPositive | fcNegZero | fcQNan,
+ NoUseInstrInfoNSZNoNan.KnownFPClasses);
+ EXPECT_EQ(std::nullopt, NoUseInstrInfoNSZNoNan.SignBit);
+ }
+}
+
TEST_F(ValueTrackingTest, isNonZeroRecurrence) {
parseAssembly(R"(
define i1 @test(i8 %n, i8 %r) {
More information about the llvm-commits
mailing list