Skip to content

Commit 266b2a2

Browse files
committed
[ValueTracking] Add tests for computeKnownFPClass of llvm.vector.reduce.{fmin,fmax,fmaximum,fminimum}; NFC
1 parent c6e0162 commit 266b2a2

File tree

2 files changed

+246
-0
lines changed

2 files changed

+246
-0
lines changed
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2+
; RUN: opt < %s -S -passes=instcombine | FileCheck %s
3+
4+
define i1 @vector_reduce_maximum_signbit(<4 x double> nofpclass(nan nzero) %x) {
5+
; CHECK-LABEL: define i1 @vector_reduce_maximum_signbit
6+
; 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]]
11+
;
12+
%x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
13+
%op = call double @llvm.vector.reduce.fmaximum.v4f64(<4 x double> %x.abs)
14+
%cmp = fcmp oge double %op, 0.0
15+
ret i1 %cmp
16+
}
17+
18+
define i1 @vector_reduce_maximum_signbit_fail_maybe_nan(<4 x double> nofpclass(nzero) %x) {
19+
; CHECK-LABEL: define i1 @vector_reduce_maximum_signbit_fail_maybe_nan
20+
; CHECK-SAME: (<4 x double> nofpclass(nzero) [[X:%.*]]) {
21+
; CHECK-NEXT: [[X_ABS:%.*]] = call <4 x double> @llvm.fabs.v4f64(<4 x double> [[X]])
22+
; CHECK-NEXT: [[OP:%.*]] = call double @llvm.vector.reduce.fmaximum.v4f64(<4 x double> [[X_ABS]])
23+
; CHECK-NEXT: [[CMP:%.*]] = fcmp oge double [[OP]], 0.000000e+00
24+
; CHECK-NEXT: ret i1 [[CMP]]
25+
;
26+
%x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
27+
%op = call double @llvm.vector.reduce.fmaximum.v4f64(<4 x double> %x.abs)
28+
%cmp = fcmp oge double %op, 0.0
29+
ret i1 %cmp
30+
}
31+
32+
33+
define i1 @vector_reduce_minimum_signbit(<4 x double> nofpclass(nan nzero) %x) {
34+
; CHECK-LABEL: define i1 @vector_reduce_minimum_signbit
35+
; 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]]
40+
;
41+
%x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
42+
%op = call double @llvm.vector.reduce.fminimum.v4f64(<4 x double> %x.abs)
43+
%cmp = fcmp oge double %op, 0.0
44+
ret i1 %cmp
45+
}
46+
47+
define i1 @vector_reduce_minimum_signbit_fail_maybe_nan(<4 x double> nofpclass(nzero) %x) {
48+
; CHECK-LABEL: define i1 @vector_reduce_minimum_signbit_fail_maybe_nan
49+
; CHECK-SAME: (<4 x double> nofpclass(nzero) [[X:%.*]]) {
50+
; CHECK-NEXT: [[X_ABS:%.*]] = call <4 x double> @llvm.fabs.v4f64(<4 x double> [[X]])
51+
; CHECK-NEXT: [[OP:%.*]] = call double @llvm.vector.reduce.fminimum.v4f64(<4 x double> [[X_ABS]])
52+
; CHECK-NEXT: [[CMP:%.*]] = fcmp oge double [[OP]], 0.000000e+00
53+
; CHECK-NEXT: ret i1 [[CMP]]
54+
;
55+
%x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
56+
%op = call double @llvm.vector.reduce.fminimum.v4f64(<4 x double> %x.abs)
57+
%cmp = fcmp oge double %op, 0.0
58+
ret i1 %cmp
59+
}
60+
61+
define i1 @vector_reduce_max_signbit(<4 x double> nofpclass(nan nzero) %x) {
62+
; CHECK-LABEL: define i1 @vector_reduce_max_signbit
63+
; 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]]
68+
;
69+
%x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
70+
%op = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> %x.abs)
71+
%cmp = fcmp oge double %op, 0.0
72+
ret i1 %cmp
73+
}
74+
75+
define i1 @vector_reduce_max_signbit_fail_maybe_nan(<4 x double> nofpclass(nzero) %x) {
76+
; CHECK-LABEL: define i1 @vector_reduce_max_signbit_fail_maybe_nan
77+
; CHECK-SAME: (<4 x double> nofpclass(nzero) [[X:%.*]]) {
78+
; CHECK-NEXT: [[X_ABS:%.*]] = call <4 x double> @llvm.fabs.v4f64(<4 x double> [[X]])
79+
; CHECK-NEXT: [[OP:%.*]] = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> [[X_ABS]])
80+
; CHECK-NEXT: [[CMP:%.*]] = fcmp oge double [[OP]], 0.000000e+00
81+
; CHECK-NEXT: ret i1 [[CMP]]
82+
;
83+
%x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
84+
%op = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> %x.abs)
85+
%cmp = fcmp oge double %op, 0.0
86+
ret i1 %cmp
87+
}
88+
89+
90+
define i1 @vector_reduce_min_signbit(<4 x double> nofpclass(nan nzero) %x) {
91+
; CHECK-LABEL: define i1 @vector_reduce_min_signbit
92+
; 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]]
97+
;
98+
%x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
99+
%op = call double @llvm.vector.reduce.fmin.v4f64(<4 x double> %x.abs)
100+
%cmp = fcmp oge double %op, 0.0
101+
ret i1 %cmp
102+
}
103+
104+
define i1 @vector_reduce_min_signbit_fail_maybe_nan(<4 x double> nofpclass(nzero) %x) {
105+
; CHECK-LABEL: define i1 @vector_reduce_min_signbit_fail_maybe_nan
106+
; CHECK-SAME: (<4 x double> nofpclass(nzero) [[X:%.*]]) {
107+
; CHECK-NEXT: [[X_ABS:%.*]] = call <4 x double> @llvm.fabs.v4f64(<4 x double> [[X]])
108+
; CHECK-NEXT: [[OP:%.*]] = call double @llvm.vector.reduce.fmin.v4f64(<4 x double> [[X_ABS]])
109+
; CHECK-NEXT: [[CMP:%.*]] = fcmp oge double [[OP]], 0.000000e+00
110+
; CHECK-NEXT: ret i1 [[CMP]]
111+
;
112+
%x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
113+
%op = call double @llvm.vector.reduce.fmin.v4f64(<4 x double> %x.abs)
114+
%cmp = fcmp oge double %op, 0.0
115+
ret i1 %cmp
116+
}
117+
118+
119+
120+
define i1 @vector_reduce_min_signbit_nnan_from_fmf(<4 x double> nofpclass(nzero) %x) {
121+
; CHECK-LABEL: define i1 @vector_reduce_min_signbit_nnan_from_fmf
122+
; 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]]
127+
;
128+
%x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
129+
%op = call nnan double @llvm.vector.reduce.fmin.v4f64(<4 x double> %x.abs)
130+
%cmp = fcmp oge double %op, 0.0
131+
ret i1 %cmp
132+
}
133+
134+

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

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,6 +1109,118 @@ define float @fcmp_ult_neginf_implies_class_assert(float %arg) {
11091109
ret float %mul_by_zero
11101110
}
11111111

1112+
define i1 @isKnownNeverInfinity_vector_reduce_maximum(<4 x double> %x) {
1113+
; CHECK-LABEL: define i1 @isKnownNeverInfinity_vector_reduce_maximum
1114+
; 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]]
1119+
;
1120+
%ninf.x = fadd ninf <4 x double> %x, <double 1.0, double 1.0, double 1.0, double 1.0>
1121+
%op = call double @llvm.vector.reduce.fmaximum.v4f64(<4 x double> %ninf.x)
1122+
%cmp = fcmp une double %op, 0x7ff0000000000000
1123+
ret i1 %cmp
1124+
}
1125+
1126+
define i1 @isKnownNeverInfinity_vector_reduce_maximum_fail(<4 x double> %x) {
1127+
; CHECK-LABEL: define i1 @isKnownNeverInfinity_vector_reduce_maximum_fail
1128+
; CHECK-SAME: (<4 x double> [[X:%.*]]) {
1129+
; CHECK-NEXT: [[NINF_X:%.*]] = fadd <4 x double> [[X]], <double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00>
1130+
; CHECK-NEXT: [[OP:%.*]] = call double @llvm.vector.reduce.fmaximum.v4f64(<4 x double> [[NINF_X]])
1131+
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[OP]], 0x7FF0000000000000
1132+
; CHECK-NEXT: ret i1 [[CMP]]
1133+
;
1134+
%ninf.x = fadd <4 x double> %x, <double 1.0, double 1.0, double 1.0, double 1.0>
1135+
%op = call double @llvm.vector.reduce.fmaximum.v4f64(<4 x double> %ninf.x)
1136+
%cmp = fcmp une double %op, 0x7ff0000000000000
1137+
ret i1 %cmp
1138+
}
1139+
1140+
define i1 @isKnownNeverInfinity_vector_reduce_minimum(<4 x double> %x) {
1141+
; CHECK-LABEL: define i1 @isKnownNeverInfinity_vector_reduce_minimum
1142+
; 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]]
1147+
;
1148+
%ninf.x = fadd ninf <4 x double> %x, <double 1.0, double 1.0, double 1.0, double 1.0>
1149+
%op = call double @llvm.vector.reduce.fminimum.v4f64(<4 x double> %ninf.x)
1150+
%cmp = fcmp une double %op, 0x7ff0000000000000
1151+
ret i1 %cmp
1152+
}
1153+
1154+
define i1 @isKnownNeverInfinity_vector_reduce_minimum_fail(<4 x double> %x) {
1155+
; CHECK-LABEL: define i1 @isKnownNeverInfinity_vector_reduce_minimum_fail
1156+
; CHECK-SAME: (<4 x double> [[X:%.*]]) {
1157+
; CHECK-NEXT: [[NINF_X:%.*]] = fadd <4 x double> [[X]], <double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00>
1158+
; CHECK-NEXT: [[OP:%.*]] = call double @llvm.vector.reduce.fminimum.v4f64(<4 x double> [[NINF_X]])
1159+
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[OP]], 0x7FF0000000000000
1160+
; CHECK-NEXT: ret i1 [[CMP]]
1161+
;
1162+
%ninf.x = fadd <4 x double> %x, <double 1.0, double 1.0, double 1.0, double 1.0>
1163+
%op = call double @llvm.vector.reduce.fminimum.v4f64(<4 x double> %ninf.x)
1164+
%cmp = fcmp une double %op, 0x7ff0000000000000
1165+
ret i1 %cmp
1166+
}
1167+
1168+
define i1 @isKnownNeverInfinity_vector_reduce_fmax(<4 x double> %x) {
1169+
; CHECK-LABEL: define i1 @isKnownNeverInfinity_vector_reduce_fmax
1170+
; 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]]
1175+
;
1176+
%ninf.x = fadd ninf <4 x double> %x, <double 1.0, double 1.0, double 1.0, double 1.0>
1177+
%op = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> %ninf.x)
1178+
%cmp = fcmp une double %op, 0x7ff0000000000000
1179+
ret i1 %cmp
1180+
}
1181+
1182+
define i1 @isKnownNeverInfinity_vector_reduce_fmax_fail(<4 x double> %x) {
1183+
; CHECK-LABEL: define i1 @isKnownNeverInfinity_vector_reduce_fmax_fail
1184+
; CHECK-SAME: (<4 x double> [[X:%.*]]) {
1185+
; CHECK-NEXT: [[NINF_X:%.*]] = fadd <4 x double> [[X]], <double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00>
1186+
; CHECK-NEXT: [[OP:%.*]] = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> [[NINF_X]])
1187+
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[OP]], 0x7FF0000000000000
1188+
; CHECK-NEXT: ret i1 [[CMP]]
1189+
;
1190+
%ninf.x = fadd <4 x double> %x, <double 1.0, double 1.0, double 1.0, double 1.0>
1191+
%op = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> %ninf.x)
1192+
%cmp = fcmp une double %op, 0x7ff0000000000000
1193+
ret i1 %cmp
1194+
}
1195+
1196+
define i1 @isKnownNeverInfinity_vector_reduce_fmin(<4 x double> %x) {
1197+
; CHECK-LABEL: define i1 @isKnownNeverInfinity_vector_reduce_fmin
1198+
; 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]]
1203+
;
1204+
%ninf.x = fadd ninf <4 x double> %x, <double 1.0, double 1.0, double 1.0, double 1.0>
1205+
%op = call double @llvm.vector.reduce.fmin.v4f64(<4 x double> %ninf.x)
1206+
%cmp = fcmp une double %op, 0x7ff0000000000000
1207+
ret i1 %cmp
1208+
}
1209+
1210+
define i1 @isKnownNeverInfinity_vector_reduce_fmin_fail(<4 x double> %x) {
1211+
; CHECK-LABEL: define i1 @isKnownNeverInfinity_vector_reduce_fmin_fail
1212+
; CHECK-SAME: (<4 x double> [[X:%.*]]) {
1213+
; CHECK-NEXT: [[NINF_X:%.*]] = fadd <4 x double> [[X]], <double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00>
1214+
; CHECK-NEXT: [[OP:%.*]] = call double @llvm.vector.reduce.fmin.v4f64(<4 x double> [[NINF_X]])
1215+
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[OP]], 0x7FF0000000000000
1216+
; CHECK-NEXT: ret i1 [[CMP]]
1217+
;
1218+
%ninf.x = fadd <4 x double> %x, <double 1.0, double 1.0, double 1.0, double 1.0>
1219+
%op = call double @llvm.vector.reduce.fmin.v4f64(<4 x double> %ninf.x)
1220+
%cmp = fcmp une double %op, 0x7ff0000000000000
1221+
ret i1 %cmp
1222+
}
1223+
11121224
declare double @llvm.arithmetic.fence.f64(double)
11131225
declare double @llvm.canonicalize.f64(double)
11141226
declare double @llvm.ceil.f64(double)

0 commit comments

Comments
 (0)