xref: /llvm-project/llvm/test/Transforms/InstCombine/known-fpclass-reduce-signbit.ll (revision 9eeae4421198b99eab3ae9a4ff678fda26bbda2a)
1266b2a26SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2266b2a26SNoah Goldstein; RUN: opt < %s -S -passes=instcombine | FileCheck %s
3266b2a26SNoah Goldstein
4266b2a26SNoah Goldsteindefine i1 @vector_reduce_maximum_signbit(<4 x double> nofpclass(nan nzero) %x) {
5266b2a26SNoah Goldstein; CHECK-LABEL: define i1 @vector_reduce_maximum_signbit
6266b2a26SNoah Goldstein; CHECK-SAME: (<4 x double> nofpclass(nan nzero) [[X:%.*]]) {
7*9eeae442SNoah Goldstein; CHECK-NEXT:    ret i1 true
8266b2a26SNoah Goldstein;
9266b2a26SNoah Goldstein  %x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
10266b2a26SNoah Goldstein  %op = call double @llvm.vector.reduce.fmaximum.v4f64(<4 x double> %x.abs)
11266b2a26SNoah Goldstein  %cmp = fcmp oge double %op, 0.0
12266b2a26SNoah Goldstein  ret i1 %cmp
13266b2a26SNoah Goldstein}
14266b2a26SNoah Goldstein
15266b2a26SNoah Goldsteindefine i1 @vector_reduce_maximum_signbit_fail_maybe_nan(<4 x double> nofpclass(nzero) %x) {
16266b2a26SNoah Goldstein; CHECK-LABEL: define i1 @vector_reduce_maximum_signbit_fail_maybe_nan
17266b2a26SNoah Goldstein; CHECK-SAME: (<4 x double> nofpclass(nzero) [[X:%.*]]) {
18266b2a26SNoah Goldstein; CHECK-NEXT:    [[X_ABS:%.*]] = call <4 x double> @llvm.fabs.v4f64(<4 x double> [[X]])
19266b2a26SNoah Goldstein; CHECK-NEXT:    [[OP:%.*]] = call double @llvm.vector.reduce.fmaximum.v4f64(<4 x double> [[X_ABS]])
20266b2a26SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = fcmp oge double [[OP]], 0.000000e+00
21266b2a26SNoah Goldstein; CHECK-NEXT:    ret i1 [[CMP]]
22266b2a26SNoah Goldstein;
23266b2a26SNoah Goldstein  %x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
24266b2a26SNoah Goldstein  %op = call double @llvm.vector.reduce.fmaximum.v4f64(<4 x double> %x.abs)
25266b2a26SNoah Goldstein  %cmp = fcmp oge double %op, 0.0
26266b2a26SNoah Goldstein  ret i1 %cmp
27266b2a26SNoah Goldstein}
28266b2a26SNoah Goldstein
29266b2a26SNoah Goldstein
30266b2a26SNoah Goldsteindefine i1 @vector_reduce_minimum_signbit(<4 x double> nofpclass(nan nzero) %x) {
31266b2a26SNoah Goldstein; CHECK-LABEL: define i1 @vector_reduce_minimum_signbit
32266b2a26SNoah Goldstein; CHECK-SAME: (<4 x double> nofpclass(nan nzero) [[X:%.*]]) {
33*9eeae442SNoah Goldstein; CHECK-NEXT:    ret i1 true
34266b2a26SNoah Goldstein;
35266b2a26SNoah Goldstein  %x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
36266b2a26SNoah Goldstein  %op = call double @llvm.vector.reduce.fminimum.v4f64(<4 x double> %x.abs)
37266b2a26SNoah Goldstein  %cmp = fcmp oge double %op, 0.0
38266b2a26SNoah Goldstein  ret i1 %cmp
39266b2a26SNoah Goldstein}
40266b2a26SNoah Goldstein
41266b2a26SNoah Goldsteindefine i1 @vector_reduce_minimum_signbit_fail_maybe_nan(<4 x double> nofpclass(nzero) %x) {
42266b2a26SNoah Goldstein; CHECK-LABEL: define i1 @vector_reduce_minimum_signbit_fail_maybe_nan
43266b2a26SNoah Goldstein; CHECK-SAME: (<4 x double> nofpclass(nzero) [[X:%.*]]) {
44266b2a26SNoah Goldstein; CHECK-NEXT:    [[X_ABS:%.*]] = call <4 x double> @llvm.fabs.v4f64(<4 x double> [[X]])
45266b2a26SNoah Goldstein; CHECK-NEXT:    [[OP:%.*]] = call double @llvm.vector.reduce.fminimum.v4f64(<4 x double> [[X_ABS]])
46266b2a26SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = fcmp oge double [[OP]], 0.000000e+00
47266b2a26SNoah Goldstein; CHECK-NEXT:    ret i1 [[CMP]]
48266b2a26SNoah Goldstein;
49266b2a26SNoah Goldstein  %x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
50266b2a26SNoah Goldstein  %op = call double @llvm.vector.reduce.fminimum.v4f64(<4 x double> %x.abs)
51266b2a26SNoah Goldstein  %cmp = fcmp oge double %op, 0.0
52266b2a26SNoah Goldstein  ret i1 %cmp
53266b2a26SNoah Goldstein}
54266b2a26SNoah Goldstein
55266b2a26SNoah Goldsteindefine i1 @vector_reduce_max_signbit(<4 x double> nofpclass(nan nzero) %x) {
56266b2a26SNoah Goldstein; CHECK-LABEL: define i1 @vector_reduce_max_signbit
57266b2a26SNoah Goldstein; CHECK-SAME: (<4 x double> nofpclass(nan nzero) [[X:%.*]]) {
58*9eeae442SNoah Goldstein; CHECK-NEXT:    ret i1 true
59266b2a26SNoah Goldstein;
60266b2a26SNoah Goldstein  %x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
61266b2a26SNoah Goldstein  %op = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> %x.abs)
62266b2a26SNoah Goldstein  %cmp = fcmp oge double %op, 0.0
63266b2a26SNoah Goldstein  ret i1 %cmp
64266b2a26SNoah Goldstein}
65266b2a26SNoah Goldstein
66266b2a26SNoah Goldsteindefine i1 @vector_reduce_max_signbit_fail_maybe_nan(<4 x double> nofpclass(nzero) %x) {
67266b2a26SNoah Goldstein; CHECK-LABEL: define i1 @vector_reduce_max_signbit_fail_maybe_nan
68266b2a26SNoah Goldstein; CHECK-SAME: (<4 x double> nofpclass(nzero) [[X:%.*]]) {
69266b2a26SNoah Goldstein; CHECK-NEXT:    [[X_ABS:%.*]] = call <4 x double> @llvm.fabs.v4f64(<4 x double> [[X]])
70266b2a26SNoah Goldstein; CHECK-NEXT:    [[OP:%.*]] = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> [[X_ABS]])
71266b2a26SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = fcmp oge double [[OP]], 0.000000e+00
72266b2a26SNoah Goldstein; CHECK-NEXT:    ret i1 [[CMP]]
73266b2a26SNoah Goldstein;
74266b2a26SNoah Goldstein  %x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
75266b2a26SNoah Goldstein  %op = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> %x.abs)
76266b2a26SNoah Goldstein  %cmp = fcmp oge double %op, 0.0
77266b2a26SNoah Goldstein  ret i1 %cmp
78266b2a26SNoah Goldstein}
79266b2a26SNoah Goldstein
80266b2a26SNoah Goldstein
81266b2a26SNoah Goldsteindefine i1 @vector_reduce_min_signbit(<4 x double> nofpclass(nan nzero) %x) {
82266b2a26SNoah Goldstein; CHECK-LABEL: define i1 @vector_reduce_min_signbit
83266b2a26SNoah Goldstein; CHECK-SAME: (<4 x double> nofpclass(nan nzero) [[X:%.*]]) {
84*9eeae442SNoah Goldstein; CHECK-NEXT:    ret i1 true
85266b2a26SNoah Goldstein;
86266b2a26SNoah Goldstein  %x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
87266b2a26SNoah Goldstein  %op = call double @llvm.vector.reduce.fmin.v4f64(<4 x double> %x.abs)
88266b2a26SNoah Goldstein  %cmp = fcmp oge double %op, 0.0
89266b2a26SNoah Goldstein  ret i1 %cmp
90266b2a26SNoah Goldstein}
91266b2a26SNoah Goldstein
92266b2a26SNoah Goldsteindefine i1 @vector_reduce_min_signbit_fail_maybe_nan(<4 x double> nofpclass(nzero) %x) {
93266b2a26SNoah Goldstein; CHECK-LABEL: define i1 @vector_reduce_min_signbit_fail_maybe_nan
94266b2a26SNoah Goldstein; CHECK-SAME: (<4 x double> nofpclass(nzero) [[X:%.*]]) {
95266b2a26SNoah Goldstein; CHECK-NEXT:    [[X_ABS:%.*]] = call <4 x double> @llvm.fabs.v4f64(<4 x double> [[X]])
96266b2a26SNoah Goldstein; CHECK-NEXT:    [[OP:%.*]] = call double @llvm.vector.reduce.fmin.v4f64(<4 x double> [[X_ABS]])
97266b2a26SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = fcmp oge double [[OP]], 0.000000e+00
98266b2a26SNoah Goldstein; CHECK-NEXT:    ret i1 [[CMP]]
99266b2a26SNoah Goldstein;
100266b2a26SNoah Goldstein  %x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
101266b2a26SNoah Goldstein  %op = call double @llvm.vector.reduce.fmin.v4f64(<4 x double> %x.abs)
102266b2a26SNoah Goldstein  %cmp = fcmp oge double %op, 0.0
103266b2a26SNoah Goldstein  ret i1 %cmp
104266b2a26SNoah Goldstein}
105266b2a26SNoah Goldstein
106266b2a26SNoah Goldstein
107266b2a26SNoah Goldstein
108266b2a26SNoah Goldsteindefine i1 @vector_reduce_min_signbit_nnan_from_fmf(<4 x double> nofpclass(nzero) %x) {
109266b2a26SNoah Goldstein; CHECK-LABEL: define i1 @vector_reduce_min_signbit_nnan_from_fmf
110266b2a26SNoah Goldstein; CHECK-SAME: (<4 x double> nofpclass(nzero) [[X:%.*]]) {
111*9eeae442SNoah Goldstein; CHECK-NEXT:    ret i1 true
112266b2a26SNoah Goldstein;
113266b2a26SNoah Goldstein  %x.abs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)
114266b2a26SNoah Goldstein  %op = call nnan double @llvm.vector.reduce.fmin.v4f64(<4 x double> %x.abs)
115266b2a26SNoah Goldstein  %cmp = fcmp oge double %op, 0.0
116266b2a26SNoah Goldstein  ret i1 %cmp
117266b2a26SNoah Goldstein}
118266b2a26SNoah Goldstein
119266b2a26SNoah Goldstein
120