Skip to content

Commit f4f826b

Browse files
committed
Revert "Revert "ValueTracking: Fix nan result handling for fmul""
This reverts commit 464dcab. Going to fix forward size regression instead due to more dependent patches needing to be reverted otherwise.
1 parent 85f4ef3 commit f4f826b

File tree

4 files changed

+40
-27
lines changed

4 files changed

+40
-27
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4760,29 +4760,36 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
47604760
if ((InterestedClasses & fcNan) != fcNan)
47614761
break;
47624762

4763+
// fcSubnormal is only needed in case of DAZ.
4764+
const FPClassTest NeedForNan = fcNan | fcInf | fcZero | fcSubnormal;
4765+
47634766
KnownFPClass KnownLHS, KnownRHS;
4764-
computeKnownFPClass(Op->getOperand(1), DemandedElts,
4765-
fcNan | fcInf | fcZero | fcSubnormal, KnownRHS,
4767+
computeKnownFPClass(Op->getOperand(1), DemandedElts, NeedForNan, KnownRHS,
47664768
Depth + 1, Q);
4767-
if (KnownRHS.isKnownNeverNaN() &&
4768-
(KnownRHS.isKnownNeverInfinity() || KnownRHS.isKnownNeverZero())) {
4769-
computeKnownFPClass(Op->getOperand(0), DemandedElts,
4770-
fcNan | fcInf | fcZero, KnownLHS, Depth + 1, Q);
4771-
if (!KnownLHS.isKnownNeverNaN())
4772-
break;
4769+
if (!KnownRHS.isKnownNeverNaN())
4770+
break;
47734771

4774-
const Function *F = cast<Instruction>(Op)->getFunction();
4772+
computeKnownFPClass(Op->getOperand(0), DemandedElts, NeedForNan, KnownLHS,
4773+
Depth + 1, Q);
4774+
if (!KnownLHS.isKnownNeverNaN())
4775+
break;
47754776

4776-
// If neither side can be zero (or nan) fmul never produces NaN.
4777-
// TODO: Check operand combinations.
4778-
// e.g. fmul nofpclass(inf nan zero), nofpclass(nan) -> nofpclass(nan)
4779-
if ((KnownLHS.isKnownNeverInfinity() ||
4780-
(F && KnownLHS.isKnownNeverLogicalZero(*F, Op->getType()))) &&
4781-
(KnownRHS.isKnownNeverInfinity() ||
4782-
(F && KnownRHS.isKnownNeverLogicalZero(*F, Op->getType()))))
4783-
Known.knownNot(fcNan);
4777+
// If 0 * +/-inf produces NaN.
4778+
if (KnownLHS.isKnownNeverInfinity() && KnownRHS.isKnownNeverInfinity()) {
4779+
Known.knownNot(fcNan);
4780+
break;
47844781
}
47854782

4783+
const Function *F = cast<Instruction>(Op)->getFunction();
4784+
if (!F)
4785+
break;
4786+
4787+
if ((KnownRHS.isKnownNeverInfinity() ||
4788+
KnownLHS.isKnownNeverLogicalZero(*F, Op->getType())) &&
4789+
(KnownLHS.isKnownNeverInfinity() ||
4790+
KnownRHS.isKnownNeverLogicalZero(*F, Op->getType())))
4791+
Known.knownNot(fcNan);
4792+
47864793
break;
47874794
}
47884795
case Instruction::FDiv:

llvm/test/Transforms/Attributor/nofpclass-nan-fmul.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ define float @ret_fmul_ieee_nonan_noinf__nonan_noinf(float nofpclass(nan inf) %a
6262
}
6363

6464
define float @ret_fmul_ieee_nonan_nozero__nonan_noinf(float nofpclass(nan zero) %arg0, float nofpclass(nan inf) %arg1) #0 {
65-
; CHECK-LABEL: define nofpclass(nan) float @ret_fmul_ieee_nonan_nozero__nonan_noinf
65+
; CHECK-LABEL: define float @ret_fmul_ieee_nonan_nozero__nonan_noinf
6666
; CHECK-SAME: (float nofpclass(nan zero) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR0]] {
6767
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
6868
; CHECK-NEXT: ret float [[FMUL]]
@@ -72,7 +72,7 @@ define float @ret_fmul_ieee_nonan_nozero__nonan_noinf(float nofpclass(nan zero)
7272
}
7373

7474
define float @ret_fmul_ieee_nonan_noinf__nonan_nozero(float nofpclass(nan inf) %arg0, float nofpclass(nan zero) %arg1) #0 {
75-
; CHECK-LABEL: define nofpclass(nan) float @ret_fmul_ieee_nonan_noinf__nonan_nozero
75+
; CHECK-LABEL: define float @ret_fmul_ieee_nonan_noinf__nonan_nozero
7676
; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan zero) [[ARG1:%.*]]) #[[ATTR0]] {
7777
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
7878
; CHECK-NEXT: ret float [[FMUL]]
@@ -285,7 +285,7 @@ define float @ret_fmul_ieee_noinf_nonan__nozero(float nofpclass(inf nan) %arg0,
285285
}
286286

287287
define float @ret_fmul_ieee_nozero_nonan__noinf_nonan(float nofpclass(zero nan) %arg0, float nofpclass(inf nan) %arg1) {
288-
; CHECK-LABEL: define nofpclass(nan) float @ret_fmul_ieee_nozero_nonan__noinf_nonan
288+
; CHECK-LABEL: define float @ret_fmul_ieee_nozero_nonan__noinf_nonan
289289
; CHECK-SAME: (float nofpclass(nan zero) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR4]] {
290290
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
291291
; CHECK-NEXT: ret float [[FMUL]]
@@ -295,7 +295,7 @@ define float @ret_fmul_ieee_nozero_nonan__noinf_nonan(float nofpclass(zero nan)
295295
}
296296

297297
define float @ret_fmul_ieee_noinf_nonan__nozero_nonan(float nofpclass(inf nan) %arg0, float nofpclass(zero nan) %arg1) {
298-
; CHECK-LABEL: define nofpclass(nan) float @ret_fmul_ieee_noinf_nonan__nozero_nonan
298+
; CHECK-LABEL: define float @ret_fmul_ieee_noinf_nonan__nozero_nonan
299299
; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan zero) [[ARG1:%.*]]) #[[ATTR4]] {
300300
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
301301
; CHECK-NEXT: ret float [[FMUL]]
@@ -345,7 +345,7 @@ define float @ret_fmul_ieee_nozero_nonan__nozero_nonan_noinf(float nofpclass(zer
345345
}
346346

347347
define float @ret_fmul_ieee_nozero_nonan_noinf__nonan(float nofpclass(zero nan inf) %arg0, float nofpclass(nan) %arg1) {
348-
; CHECK-LABEL: define float @ret_fmul_ieee_nozero_nonan_noinf__nonan
348+
; CHECK-LABEL: define nofpclass(nan) float @ret_fmul_ieee_nozero_nonan_noinf__nonan
349349
; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan) [[ARG1:%.*]]) #[[ATTR4]] {
350350
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
351351
; CHECK-NEXT: ret float [[FMUL]]
@@ -355,7 +355,7 @@ define float @ret_fmul_ieee_nozero_nonan_noinf__nonan(float nofpclass(zero nan i
355355
}
356356

357357
define float @ret_fmul_ieee_nonan__nozero_nonan_noinf(float nofpclass(nan) %arg0, float nofpclass(zero nan inf) %arg1) {
358-
; CHECK-LABEL: define float @ret_fmul_ieee_nonan__nozero_nonan_noinf
358+
; CHECK-LABEL: define nofpclass(nan) float @ret_fmul_ieee_nonan__nozero_nonan_noinf
359359
; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR4]] {
360360
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
361361
; CHECK-NEXT: ret float [[FMUL]]

llvm/test/Transforms/Inline/simplify-instruction-computeKnownFPClass-context.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@ define internal i1 @simplify_fcmp_ord_frem_callee(double %a, double %b) {
6060
ret i1 %cmp
6161
}
6262

63-
define i1 @simplify_fcmp_ord_fmul_caller(double nofpclass(zero nan) %i0, double nofpclass(zero nan) %i1) {
63+
define i1 @simplify_fcmp_ord_fmul_caller(double nofpclass(zero nan inf) %i0, double nofpclass(zero nan inf) %i1) {
6464
; CHECK-LABEL: define i1 @simplify_fcmp_ord_fmul_caller
65-
; CHECK-SAME: (double nofpclass(nan zero) [[I0:%.*]], double nofpclass(nan zero) [[I1:%.*]]) {
65+
; CHECK-SAME: (double nofpclass(nan inf zero) [[I0:%.*]], double nofpclass(nan inf zero) [[I1:%.*]]) {
6666
; CHECK-NEXT: [[SUB_DOUBLE_SUB_I:%.*]] = fmul double [[I0]], [[I1]]
6767
; CHECK-NEXT: ret i1 true
6868
;

llvm/test/Transforms/InstSimplify/known-never-nan.ll

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,10 @@ unwind:
559559
; This should not fold to false because fmul 0 * inf = nan
560560
define i1 @issue63316(i64 %arg) {
561561
; CHECK-LABEL: @issue63316(
562-
; CHECK-NEXT: ret i1 false
562+
; CHECK-NEXT: [[SITOFP:%.*]] = sitofp i64 [[ARG:%.*]] to float
563+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[SITOFP]], 0x7FF0000000000000
564+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp uno float [[FMUL]], 0.000000e+00
565+
; CHECK-NEXT: ret i1 [[FCMP]]
563566
;
564567
%sitofp = sitofp i64 %arg to float
565568
%fmul = fmul float %sitofp, 0x7FF0000000000000
@@ -569,7 +572,10 @@ define i1 @issue63316(i64 %arg) {
569572

570573
define i1 @issue63316_commute(i64 %arg) {
571574
; CHECK-LABEL: @issue63316_commute(
572-
; CHECK-NEXT: ret i1 false
575+
; CHECK-NEXT: [[SITOFP:%.*]] = sitofp i64 [[ARG:%.*]] to float
576+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float 0x7FF0000000000000, [[SITOFP]]
577+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp uno float [[FMUL]], 0.000000e+00
578+
; CHECK-NEXT: ret i1 [[FCMP]]
573579
;
574580
%sitofp = sitofp i64 %arg to float
575581
%fmul = fmul float 0x7FF0000000000000, %sitofp

0 commit comments

Comments
 (0)