Skip to content

Commit 464dcab

Browse files
committed
Revert "ValueTracking: Fix nan result handling for fmul"
This reverts commit a632ca4. Dependent commit to be reverted
1 parent 95d3fd9 commit 464dcab

File tree

4 files changed

+27
-40
lines changed

4 files changed

+27
-40
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4760,36 +4760,29 @@ 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-
47664763
KnownFPClass KnownLHS, KnownRHS;
4767-
computeKnownFPClass(Op->getOperand(1), DemandedElts, NeedForNan, KnownRHS,
4764+
computeKnownFPClass(Op->getOperand(1), DemandedElts,
4765+
fcNan | fcInf | fcZero | fcSubnormal, KnownRHS,
47684766
Depth + 1, Q);
4769-
if (!KnownRHS.isKnownNeverNaN())
4770-
break;
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;
47714773

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

4777-
// If 0 * +/-inf produces NaN.
4778-
if (KnownLHS.isKnownNeverInfinity() && KnownRHS.isKnownNeverInfinity()) {
4779-
Known.knownNot(fcNan);
4780-
break;
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);
47814784
}
47824785

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-
47934786
break;
47944787
}
47954788
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 float @ret_fmul_ieee_nonan_nozero__nonan_noinf
65+
; CHECK-LABEL: define nofpclass(nan) 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 float @ret_fmul_ieee_nonan_noinf__nonan_nozero
75+
; CHECK-LABEL: define nofpclass(nan) 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 float @ret_fmul_ieee_nozero_nonan__noinf_nonan
288+
; CHECK-LABEL: define nofpclass(nan) 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 float @ret_fmul_ieee_noinf_nonan__nozero_nonan
298+
; CHECK-LABEL: define nofpclass(nan) 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 nofpclass(nan) float @ret_fmul_ieee_nozero_nonan_noinf__nonan
348+
; CHECK-LABEL: define 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 nofpclass(nan) float @ret_fmul_ieee_nonan__nozero_nonan_noinf
358+
; CHECK-LABEL: define 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 inf) %i0, double nofpclass(zero nan inf) %i1) {
63+
define i1 @simplify_fcmp_ord_fmul_caller(double nofpclass(zero nan) %i0, double nofpclass(zero nan) %i1) {
6464
; CHECK-LABEL: define i1 @simplify_fcmp_ord_fmul_caller
65-
; CHECK-SAME: (double nofpclass(nan inf zero) [[I0:%.*]], double nofpclass(nan inf zero) [[I1:%.*]]) {
65+
; CHECK-SAME: (double nofpclass(nan zero) [[I0:%.*]], double nofpclass(nan 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: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -559,10 +559,7 @@ 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: [[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]]
562+
; CHECK-NEXT: ret i1 false
566563
;
567564
%sitofp = sitofp i64 %arg to float
568565
%fmul = fmul float %sitofp, 0x7FF0000000000000
@@ -572,10 +569,7 @@ define i1 @issue63316(i64 %arg) {
572569

573570
define i1 @issue63316_commute(i64 %arg) {
574571
; CHECK-LABEL: @issue63316_commute(
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]]
572+
; CHECK-NEXT: ret i1 false
579573
;
580574
%sitofp = sitofp i64 %arg to float
581575
%fmul = fmul float 0x7FF0000000000000, %sitofp

0 commit comments

Comments
 (0)