1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -S -passes=instcombine | FileCheck %s
4 ; This file used to contain more tests that folded to true/false,
5 ; but those are all tested identically in InstSimplify now.
6 ; If any remaining tests are made to return true/false, that
7 ; functionality/testing may be better housed in InstSimplify
8 ; rather than InstCombine.
10 define i1 @fabs_sqrt_src_maybe_nan(double %arg0, double %arg1) {
11 ; CHECK-LABEL: @fabs_sqrt_src_maybe_nan(
12 ; CHECK-NEXT: [[TMP:%.*]] = fcmp ord double [[ARG0:%.*]], 0.000000e+00
13 ; CHECK-NEXT: ret i1 [[TMP]]
15 %fabs = call double @llvm.fabs.f64(double %arg0)
16 %op = call double @llvm.sqrt.f64(double %fabs)
17 %tmp = fcmp ord double %op, %op
21 define i1 @select_maybe_nan_lhs(i1 %cond, double %lhs, double %arg1) {
22 ; CHECK-LABEL: @select_maybe_nan_lhs(
23 ; CHECK-NEXT: [[TMP:%.*]] = fcmp ord double [[OP:%.*]], 0.000000e+00
24 ; CHECK-NEXT: [[NOT_COND:%.*]] = xor i1 [[COND:%.*]], true
25 ; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[NOT_COND]], i1 true, i1 [[TMP]]
26 ; CHECK-NEXT: ret i1 [[TMP1]]
28 %rhs = fadd nnan double %arg1, 1.0
29 %op = select i1 %cond, double %lhs, double %rhs
30 %tmp = fcmp ord double %op, %op
34 define i1 @select_maybe_nan_rhs(i1 %cond, double %arg0, double %rhs) {
35 ; CHECK-LABEL: @select_maybe_nan_rhs(
36 ; CHECK-NEXT: [[TMP:%.*]] = fcmp ord double [[OP:%.*]], 0.000000e+00
37 ; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[COND:%.*]], i1 true, i1 [[TMP]]
38 ; CHECK-NEXT: ret i1 [[TMP1]]
40 %lhs = fadd nnan double %arg0, 1.0
41 %op = select i1 %cond, double %lhs, double %rhs
42 %tmp = fcmp ord double %op, %op
46 define i1 @nnan_fadd(double %arg0, double %arg1) {
47 ; CHECK-LABEL: @nnan_fadd(
48 ; CHECK-NEXT: [[NNAN_ARG0:%.*]] = fadd nnan double [[ARG0:%.*]], 1.000000e+00
49 ; CHECK-NEXT: [[NNAN_ARG1:%.*]] = fadd nnan double [[ARG0]], 2.000000e+00
50 ; CHECK-NEXT: [[OP:%.*]] = fadd double [[NNAN_ARG0]], [[NNAN_ARG1]]
51 ; CHECK-NEXT: [[TMP:%.*]] = fcmp ord double [[OP]], 0.000000e+00
52 ; CHECK-NEXT: ret i1 [[TMP]]
54 %nnan.arg0 = fadd nnan double %arg0, 1.0
55 %nnan.arg1 = fadd nnan double %arg0, 2.0
56 %op = fadd double %nnan.arg0, %nnan.arg1
57 %tmp = fcmp ord double %op, %op
61 define i1 @nnan_fadd_maybe_nan_lhs(double %arg0, double %arg1) {
62 ; CHECK-LABEL: @nnan_fadd_maybe_nan_lhs(
63 ; CHECK-NEXT: [[NNAN_ARG1:%.*]] = fadd nnan double [[ARG1:%.*]], 1.000000e+00
64 ; CHECK-NEXT: [[OP:%.*]] = fadd double [[ARG0:%.*]], [[NNAN_ARG1]]
65 ; CHECK-NEXT: [[TMP:%.*]] = fcmp ord double [[OP]], 0.000000e+00
66 ; CHECK-NEXT: ret i1 [[TMP]]
68 %nnan.arg1 = fadd nnan double %arg1, 1.0
69 %op = fadd double %arg0, %nnan.arg1
70 %tmp = fcmp ord double %op, %op
74 define i1 @nnan_fadd_maybe_nan_rhs(double %arg0, double %arg1) {
75 ; CHECK-LABEL: @nnan_fadd_maybe_nan_rhs(
76 ; CHECK-NEXT: [[NNAN_ARG0:%.*]] = fadd nnan double [[ARG0:%.*]], 1.000000e+00
77 ; CHECK-NEXT: [[OP:%.*]] = fadd double [[NNAN_ARG0]], [[ARG1:%.*]]
78 ; CHECK-NEXT: [[TMP:%.*]] = fcmp ord double [[OP]], 0.000000e+00
79 ; CHECK-NEXT: ret i1 [[TMP]]
81 %nnan.arg0 = fadd nnan double %arg0, 1.0
82 %op = fadd double %nnan.arg0, %arg1
83 %tmp = fcmp ord double %op, %op
87 define i1 @nnan_fmul(double %arg0, double %arg1) {
88 ; CHECK-LABEL: @nnan_fmul(
89 ; CHECK-NEXT: [[NNAN_ARG0:%.*]] = fadd nnan double [[ARG0:%.*]], 1.000000e+00
90 ; CHECK-NEXT: [[NNAN_ARG1:%.*]] = fadd nnan double [[ARG0]], 2.000000e+00
91 ; CHECK-NEXT: [[OP:%.*]] = fmul double [[NNAN_ARG0]], [[NNAN_ARG1]]
92 ; CHECK-NEXT: [[TMP:%.*]] = fcmp ord double [[OP]], 0.000000e+00
93 ; CHECK-NEXT: ret i1 [[TMP]]
95 %nnan.arg0 = fadd nnan double %arg0, 1.0
96 %nnan.arg1 = fadd nnan double %arg0, 2.0
97 %op = fmul double %nnan.arg0, %nnan.arg1
98 %tmp = fcmp ord double %op, %op
102 define i1 @nnan_fsub(double %arg0, double %arg1) {
103 ; CHECK-LABEL: @nnan_fsub(
104 ; CHECK-NEXT: [[NNAN_ARG0:%.*]] = fadd nnan double [[ARG0:%.*]], 1.000000e+00
105 ; CHECK-NEXT: [[NNAN_ARG1:%.*]] = fadd nnan double [[ARG0]], 2.000000e+00
106 ; CHECK-NEXT: [[OP:%.*]] = fsub double [[NNAN_ARG0]], [[NNAN_ARG1]]
107 ; CHECK-NEXT: [[TMP:%.*]] = fcmp ord double [[OP]], 0.000000e+00
108 ; CHECK-NEXT: ret i1 [[TMP]]
110 %nnan.arg0 = fadd nnan double %arg0, 1.0
111 %nnan.arg1 = fadd nnan double %arg0, 2.0
112 %op = fsub double %nnan.arg0, %nnan.arg1
113 %tmp = fcmp ord double %op, %op
117 declare double @func()
119 define i1 @nnan_fneg() {
120 ; CHECK-LABEL: @nnan_fneg(
121 ; CHECK-NEXT: [[NNAN:%.*]] = call nnan double @func()
122 ; CHECK-NEXT: ret i1 true
124 %nnan = call nnan double @func()
125 %op = fsub double -0.0, %nnan
126 %tmp = fcmp ord double %op, %op
130 define i1 @nnan_unary_fneg() {
131 ; CHECK-LABEL: @nnan_unary_fneg(
132 ; CHECK-NEXT: [[NNAN:%.*]] = call nnan double @func()
133 ; CHECK-NEXT: ret i1 true
135 %nnan = call nnan double @func()
136 %op = fneg double %nnan
137 %tmp = fcmp ord double %op, %op
141 define i1 @fpext_maybe_nan(float %arg0) {
142 ; CHECK-LABEL: @fpext_maybe_nan(
143 ; CHECK-NEXT: [[TMP:%.*]] = fcmp ord float [[ARG0:%.*]], 0.000000e+00
144 ; CHECK-NEXT: ret i1 [[TMP]]
146 %op = fpext float %arg0 to double
147 %tmp = fcmp ord double %op, %op
151 define i1 @fptrunc_maybe_nan(double %arg0) {
152 ; CHECK-LABEL: @fptrunc_maybe_nan(
153 ; CHECK-NEXT: [[OP:%.*]] = fptrunc double [[ARG0:%.*]] to float
154 ; CHECK-NEXT: [[TMP:%.*]] = fcmp ord float [[OP]], 0.000000e+00
155 ; CHECK-NEXT: ret i1 [[TMP]]
157 %op = fptrunc double %arg0 to float
158 %tmp = fcmp ord float %op, %op
162 define i1 @nnan_fdiv(double %arg0, double %arg1) {
163 ; CHECK-LABEL: @nnan_fdiv(
164 ; CHECK-NEXT: [[NNAN_ARG0:%.*]] = fadd nnan double [[ARG0:%.*]], 1.000000e+00
165 ; CHECK-NEXT: [[NNAN_ARG1:%.*]] = fadd nnan double [[ARG0]], 2.000000e+00
166 ; CHECK-NEXT: [[OP:%.*]] = fdiv double [[NNAN_ARG0]], [[NNAN_ARG1]]
167 ; CHECK-NEXT: [[TMP:%.*]] = fcmp ord double [[OP]], 0.000000e+00
168 ; CHECK-NEXT: ret i1 [[TMP]]
170 %nnan.arg0 = fadd nnan double %arg0, 1.0
171 %nnan.arg1 = fadd nnan double %arg0, 2.0
172 %op = fdiv double %nnan.arg0, %nnan.arg1
173 %tmp = fcmp ord double %op, %op
177 define i1 @nnan_frem(double %arg0, double %arg1) {
178 ; CHECK-LABEL: @nnan_frem(
179 ; CHECK-NEXT: [[NNAN_ARG0:%.*]] = fadd nnan double [[ARG0:%.*]], 1.000000e+00
180 ; CHECK-NEXT: [[NNAN_ARG1:%.*]] = fadd nnan double [[ARG0]], 2.000000e+00
181 ; CHECK-NEXT: [[OP:%.*]] = frem double [[NNAN_ARG0]], [[NNAN_ARG1]]
182 ; CHECK-NEXT: [[TMP:%.*]] = fcmp ord double [[OP]], 0.000000e+00
183 ; CHECK-NEXT: ret i1 [[TMP]]
185 %nnan.arg0 = fadd nnan double %arg0, 1.0
186 %nnan.arg1 = fadd nnan double %arg0, 2.0
187 %op = frem double %nnan.arg0, %nnan.arg1
188 %tmp = fcmp ord double %op, %op
192 declare double @llvm.sqrt.f64(double)
193 declare double @llvm.fabs.f64(double)
194 declare double @llvm.canonicalize.f64(double)
195 declare double @llvm.copysign.f64(double, double)
196 declare double @llvm.exp.f64(double)
197 declare double @llvm.exp2.f64(double)
198 declare double @llvm.floor.f64(double)
199 declare double @llvm.ceil.f64(double)
200 declare double @llvm.trunc.f64(double)
201 declare double @llvm.rint.f64(double)
202 declare double @llvm.nearbyint.f64(double)
203 declare double @llvm.round.f64(double)