Skip to content

Commit

Permalink
ValueTracking: Handle no-nan check for computeKnownFPClass for fmul
Browse files Browse the repository at this point in the history
Copy the logic from isKnownNeverNaN for fadd/fsub. Leave the
extension to handle the zero case for a future change.
  • Loading branch information
arsenm committed Apr 13, 2023
1 parent d6f2218 commit 4d044bf
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 1 deletion.
16 changes: 16 additions & 0 deletions llvm/lib/Analysis/ValueTracking.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4458,6 +4458,22 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts,

break;
}
case Instruction::FMul: {
KnownFPClass KnownLHS, KnownRHS;
computeKnownFPClass(Op->getOperand(1), DemandedElts, fcNan | fcInf,
KnownRHS, Depth + 1, Q, TLI);
if (KnownRHS.isKnownNeverNaN() && KnownRHS.isKnownNeverInfinity()) {
computeKnownFPClass(Op->getOperand(0), DemandedElts, fcNan | fcInf,
KnownLHS, Depth + 1, Q, TLI);

// Zero multiplied with infinity produces NaN.
// FIXME: If neither side can be zero fmul never produces NaN.
if (KnownLHS.isKnownNeverNaN() && KnownLHS.isKnownNeverInfinity())
Known.knownNot(fcNan);
}

break;
}
case Instruction::SIToFP:
case Instruction::UIToFP: {
// Cannot produce nan
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/Attributor/nofpclass-nan-fmul.ll
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ define float @ret_fmul_dynamic_nonan_nozero__nonan_nozero(float nofpclass(nan ze
}

define float @ret_fmul_ieee_nonan_noinf__nonan_noinf(float nofpclass(nan inf) %arg0, float nofpclass(nan inf) %arg1) #0 {
; CHECK-LABEL: define float @ret_fmul_ieee_nonan_noinf__nonan_noinf
; CHECK-LABEL: define nofpclass(nan) float @ret_fmul_ieee_nonan_noinf__nonan_noinf
; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
; CHECK-NEXT: ret float [[FMUL]]
Expand Down
17 changes: 17 additions & 0 deletions llvm/unittests/Analysis/ValueTrackingTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1575,6 +1575,23 @@ TEST_F(ComputeKnownFPClassTest, FSub) {
expectKnownFPClass(fcAllFlags, std::nullopt, A5);
}

TEST_F(ComputeKnownFPClassTest, FMul) {
parseAssembly(
"define float @test(float nofpclass(nan inf) %nnan.ninf, float nofpclass(nan) %nnan, float nofpclass(qnan) %no.qnan, float %unknown) {\n"
" %A = fmul float %nnan.ninf, %nnan.ninf"
" %A2 = fmul float %nnan.ninf, %nnan"
" %A3 = fmul float %nnan, %nnan.ninf"
" %A4 = fmul float %nnan.ninf, %no.qnan"
" %A5 = fmul float %nnan, %nnan"
" ret float %A\n"
"}\n");
expectKnownFPClass(fcFinite | fcInf, std::nullopt, A);
expectKnownFPClass(fcAllFlags, std::nullopt, A2);
expectKnownFPClass(fcAllFlags, std::nullopt, A3);
expectKnownFPClass(fcAllFlags, std::nullopt, A4);
expectKnownFPClass(fcAllFlags, std::nullopt, A5);
}

TEST_F(ValueTrackingTest, isNonZeroRecurrence) {
parseAssembly(R"(
define i1 @test(i8 %n, i8 %r) {
Expand Down

0 comments on commit 4d044bf

Please sign in to comment.