Skip to content

Commit 9eeae44

Browse files
committed
[ValueTracking] Implement computeKnownFPClass for llvm.vector.reduce.{fmin,fmax,fmaximum,fminimum}
Closes #88408
1 parent 266b2a2 commit 9eeae44

File tree

3 files changed

+22
-36
lines changed

3 files changed

+22
-36
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5032,6 +5032,19 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
50325032

50335033
break;
50345034
}
5035+
case Intrinsic::vector_reduce_fmax:
5036+
case Intrinsic::vector_reduce_fmin:
5037+
case Intrinsic::vector_reduce_fmaximum:
5038+
case Intrinsic::vector_reduce_fminimum: {
5039+
// reduce min/max will choose an element from one of the vector elements,
5040+
// so we can infer and class information that is common to all elements.
5041+
Known = computeKnownFPClass(II->getArgOperand(0), II->getFastMathFlags(),
5042+
InterestedClasses, Depth + 1, Q);
5043+
// Can only propagate sign if output is never NaN.
5044+
if (!Known.isKnownNeverNaN())
5045+
Known.SignBit.reset();
5046+
break;
5047+
}
50355048
case Intrinsic::trunc:
50365049
case Intrinsic::floor:
50375050
case Intrinsic::ceil:

llvm/test/Transforms/InstCombine/known-fpclass-reduce-signbit.ll

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@
44
define i1 @vector_reduce_maximum_signbit(<4 x double> nofpclass(nan nzero) %x) {
55
; CHECK-LABEL: define i1 @vector_reduce_maximum_signbit
66
; CHECK-SAME: (<4 x double> nofpclass(nan nzero) [[X:%.*]]) {
7-
; CHECK-NEXT: [[X_ABS:%.*]] = call <4 x double> @llvm.fabs.v4f64(<4 x double> [[X]])
8-
; CHECK-NEXT: [[OP:%.*]] = call double @llvm.vector.reduce.fmaximum.v4f64(<4 x double> [[X_ABS]])
9-
; CHECK-NEXT: [[CMP:%.*]] = fcmp oge double [[OP]], 0.000000e+00
10-
; CHECK-NEXT: ret i1 [[CMP]]
7+
; CHECK-NEXT: ret i1 true
118
;
129
%x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
1310
%op = call double @llvm.vector.reduce.fmaximum.v4f64(<4 x double> %x.abs)
@@ -33,10 +30,7 @@ define i1 @vector_reduce_maximum_signbit_fail_maybe_nan(<4 x double> nofpclass(n
3330
define i1 @vector_reduce_minimum_signbit(<4 x double> nofpclass(nan nzero) %x) {
3431
; CHECK-LABEL: define i1 @vector_reduce_minimum_signbit
3532
; CHECK-SAME: (<4 x double> nofpclass(nan nzero) [[X:%.*]]) {
36-
; CHECK-NEXT: [[X_ABS:%.*]] = call <4 x double> @llvm.fabs.v4f64(<4 x double> [[X]])
37-
; CHECK-NEXT: [[OP:%.*]] = call double @llvm.vector.reduce.fminimum.v4f64(<4 x double> [[X_ABS]])
38-
; CHECK-NEXT: [[CMP:%.*]] = fcmp oge double [[OP]], 0.000000e+00
39-
; CHECK-NEXT: ret i1 [[CMP]]
33+
; CHECK-NEXT: ret i1 true
4034
;
4135
%x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
4236
%op = call double @llvm.vector.reduce.fminimum.v4f64(<4 x double> %x.abs)
@@ -61,10 +55,7 @@ define i1 @vector_reduce_minimum_signbit_fail_maybe_nan(<4 x double> nofpclass(n
6155
define i1 @vector_reduce_max_signbit(<4 x double> nofpclass(nan nzero) %x) {
6256
; CHECK-LABEL: define i1 @vector_reduce_max_signbit
6357
; CHECK-SAME: (<4 x double> nofpclass(nan nzero) [[X:%.*]]) {
64-
; CHECK-NEXT: [[X_ABS:%.*]] = call <4 x double> @llvm.fabs.v4f64(<4 x double> [[X]])
65-
; CHECK-NEXT: [[OP:%.*]] = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> [[X_ABS]])
66-
; CHECK-NEXT: [[CMP:%.*]] = fcmp oge double [[OP]], 0.000000e+00
67-
; CHECK-NEXT: ret i1 [[CMP]]
58+
; CHECK-NEXT: ret i1 true
6859
;
6960
%x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
7061
%op = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> %x.abs)
@@ -90,10 +81,7 @@ define i1 @vector_reduce_max_signbit_fail_maybe_nan(<4 x double> nofpclass(nzero
9081
define i1 @vector_reduce_min_signbit(<4 x double> nofpclass(nan nzero) %x) {
9182
; CHECK-LABEL: define i1 @vector_reduce_min_signbit
9283
; CHECK-SAME: (<4 x double> nofpclass(nan nzero) [[X:%.*]]) {
93-
; CHECK-NEXT: [[X_ABS:%.*]] = call <4 x double> @llvm.fabs.v4f64(<4 x double> [[X]])
94-
; CHECK-NEXT: [[OP:%.*]] = call double @llvm.vector.reduce.fmin.v4f64(<4 x double> [[X_ABS]])
95-
; CHECK-NEXT: [[CMP:%.*]] = fcmp oge double [[OP]], 0.000000e+00
96-
; CHECK-NEXT: ret i1 [[CMP]]
84+
; CHECK-NEXT: ret i1 true
9785
;
9886
%x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
9987
%op = call double @llvm.vector.reduce.fmin.v4f64(<4 x double> %x.abs)
@@ -120,10 +108,7 @@ define i1 @vector_reduce_min_signbit_fail_maybe_nan(<4 x double> nofpclass(nzero
120108
define i1 @vector_reduce_min_signbit_nnan_from_fmf(<4 x double> nofpclass(nzero) %x) {
121109
; CHECK-LABEL: define i1 @vector_reduce_min_signbit_nnan_from_fmf
122110
; CHECK-SAME: (<4 x double> nofpclass(nzero) [[X:%.*]]) {
123-
; CHECK-NEXT: [[X_ABS:%.*]] = call <4 x double> @llvm.fabs.v4f64(<4 x double> [[X]])
124-
; CHECK-NEXT: [[OP:%.*]] = call nnan double @llvm.vector.reduce.fmin.v4f64(<4 x double> [[X_ABS]])
125-
; CHECK-NEXT: [[CMP:%.*]] = fcmp oge double [[OP]], 0.000000e+00
126-
; CHECK-NEXT: ret i1 [[CMP]]
111+
; CHECK-NEXT: ret i1 true
127112
;
128113
%x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
129114
%op = call nnan double @llvm.vector.reduce.fmin.v4f64(<4 x double> %x.abs)

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

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,10 +1112,7 @@ define float @fcmp_ult_neginf_implies_class_assert(float %arg) {
11121112
define i1 @isKnownNeverInfinity_vector_reduce_maximum(<4 x double> %x) {
11131113
; CHECK-LABEL: define i1 @isKnownNeverInfinity_vector_reduce_maximum
11141114
; CHECK-SAME: (<4 x double> [[X:%.*]]) {
1115-
; CHECK-NEXT: [[NINF_X:%.*]] = fadd ninf <4 x double> [[X]], <double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00>
1116-
; CHECK-NEXT: [[OP:%.*]] = call double @llvm.vector.reduce.fmaximum.v4f64(<4 x double> [[NINF_X]])
1117-
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[OP]], 0x7FF0000000000000
1118-
; CHECK-NEXT: ret i1 [[CMP]]
1115+
; CHECK-NEXT: ret i1 true
11191116
;
11201117
%ninf.x = fadd ninf <4 x double> %x, <double 1.0, double 1.0, double 1.0, double 1.0>
11211118
%op = call double @llvm.vector.reduce.fmaximum.v4f64(<4 x double> %ninf.x)
@@ -1140,10 +1137,7 @@ define i1 @isKnownNeverInfinity_vector_reduce_maximum_fail(<4 x double> %x) {
11401137
define i1 @isKnownNeverInfinity_vector_reduce_minimum(<4 x double> %x) {
11411138
; CHECK-LABEL: define i1 @isKnownNeverInfinity_vector_reduce_minimum
11421139
; CHECK-SAME: (<4 x double> [[X:%.*]]) {
1143-
; CHECK-NEXT: [[NINF_X:%.*]] = fadd ninf <4 x double> [[X]], <double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00>
1144-
; CHECK-NEXT: [[OP:%.*]] = call double @llvm.vector.reduce.fminimum.v4f64(<4 x double> [[NINF_X]])
1145-
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[OP]], 0x7FF0000000000000
1146-
; CHECK-NEXT: ret i1 [[CMP]]
1140+
; CHECK-NEXT: ret i1 true
11471141
;
11481142
%ninf.x = fadd ninf <4 x double> %x, <double 1.0, double 1.0, double 1.0, double 1.0>
11491143
%op = call double @llvm.vector.reduce.fminimum.v4f64(<4 x double> %ninf.x)
@@ -1168,10 +1162,7 @@ define i1 @isKnownNeverInfinity_vector_reduce_minimum_fail(<4 x double> %x) {
11681162
define i1 @isKnownNeverInfinity_vector_reduce_fmax(<4 x double> %x) {
11691163
; CHECK-LABEL: define i1 @isKnownNeverInfinity_vector_reduce_fmax
11701164
; CHECK-SAME: (<4 x double> [[X:%.*]]) {
1171-
; CHECK-NEXT: [[NINF_X:%.*]] = fadd ninf <4 x double> [[X]], <double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00>
1172-
; CHECK-NEXT: [[OP:%.*]] = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> [[NINF_X]])
1173-
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[OP]], 0x7FF0000000000000
1174-
; CHECK-NEXT: ret i1 [[CMP]]
1165+
; CHECK-NEXT: ret i1 true
11751166
;
11761167
%ninf.x = fadd ninf <4 x double> %x, <double 1.0, double 1.0, double 1.0, double 1.0>
11771168
%op = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> %ninf.x)
@@ -1196,10 +1187,7 @@ define i1 @isKnownNeverInfinity_vector_reduce_fmax_fail(<4 x double> %x) {
11961187
define i1 @isKnownNeverInfinity_vector_reduce_fmin(<4 x double> %x) {
11971188
; CHECK-LABEL: define i1 @isKnownNeverInfinity_vector_reduce_fmin
11981189
; CHECK-SAME: (<4 x double> [[X:%.*]]) {
1199-
; CHECK-NEXT: [[NINF_X:%.*]] = fadd ninf <4 x double> [[X]], <double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00>
1200-
; CHECK-NEXT: [[OP:%.*]] = call double @llvm.vector.reduce.fmin.v4f64(<4 x double> [[NINF_X]])
1201-
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[OP]], 0x7FF0000000000000
1202-
; CHECK-NEXT: ret i1 [[CMP]]
1190+
; CHECK-NEXT: ret i1 true
12031191
;
12041192
%ninf.x = fadd ninf <4 x double> %x, <double 1.0, double 1.0, double 1.0, double 1.0>
12051193
%op = call double @llvm.vector.reduce.fmin.v4f64(<4 x double> %ninf.x)

0 commit comments

Comments
 (0)