xref: /llvm-project/llvm/test/Transforms/InstCombine/fneg-fabs.ll (revision 862e35e25a68502433da0a8d0819448ff5745339)
1560dd1cdSUsman Nadeem; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2acdc419cSBjorn Pettersson; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3560dd1cdSUsman Nadeem
4560dd1cdSUsman Nadeem; (X <  +/-0.0) ? X : -X --> -fabs(X)
5560dd1cdSUsman Nadeem; (X <= +/-0.0) ? X : -X --> -fabs(X)
6560dd1cdSUsman Nadeem; One negative test with no fmf
7560dd1cdSUsman Nadeemdefine double @select_noFMF_nfabs_lt(double %x) {
8560dd1cdSUsman Nadeem; CHECK-LABEL: @select_noFMF_nfabs_lt(
9560dd1cdSUsman Nadeem; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00
10560dd1cdSUsman Nadeem; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
11560dd1cdSUsman Nadeem; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]]
12560dd1cdSUsman Nadeem; CHECK-NEXT:    ret double [[SEL]]
13560dd1cdSUsman Nadeem;
14560dd1cdSUsman Nadeem  %cmp = fcmp olt double %x, 0.000000e+00
15560dd1cdSUsman Nadeem  %negX = fneg double %x
16560dd1cdSUsman Nadeem  %sel = select i1 %cmp, double %x, double %negX
17560dd1cdSUsman Nadeem  ret double %sel
18560dd1cdSUsman Nadeem}
19560dd1cdSUsman Nadeem
20560dd1cdSUsman Nadeem; One test where the neg has fmfs.
21560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_lt_fmfProp(double %x) {
22560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_lt_fmfProp(
230ee6bad6SSanjay Patel; CHECK-NEXT:    [[TMP1:%.*]] = call nnan ninf nsz double @llvm.fabs.f64(double [[X:%.*]])
240ee6bad6SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = fneg nnan ninf nsz double [[TMP1]]
25560dd1cdSUsman Nadeem; CHECK-NEXT:    ret double [[SEL]]
26560dd1cdSUsman Nadeem;
27560dd1cdSUsman Nadeem  %cmp = fcmp olt double %x, 0.000000e+00
28560dd1cdSUsman Nadeem  %negX = fneg fast double %x
29560dd1cdSUsman Nadeem  %sel = select nsz i1 %cmp, double %x, double %negX
30560dd1cdSUsman Nadeem  ret double %sel
31560dd1cdSUsman Nadeem}
32560dd1cdSUsman Nadeem
3383ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_lt_fmfProp(double %x) {
3483ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_lt_fmfProp(
350ee6bad6SSanjay Patel; CHECK-NEXT:    [[TMP1:%.*]] = call nnan ninf nsz double @llvm.fabs.f64(double [[X:%.*]])
360ee6bad6SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = fneg nnan ninf nsz double [[TMP1]]
37560dd1cdSUsman Nadeem; CHECK-NEXT:    ret double [[SEL]]
38560dd1cdSUsman Nadeem;
39560dd1cdSUsman Nadeem  %cmp = fcmp olt double %x, 0.000000e+00
4083ed93c0SSanjay Patel  %negX = fneg fast double %x
4183ed93c0SSanjay Patel  %sel = select nsz nnan i1 %cmp, double %x, double %negX
42560dd1cdSUsman Nadeem  ret double %sel
43560dd1cdSUsman Nadeem}
44560dd1cdSUsman Nadeem
4583ed93c0SSanjay Patel; Tests with various predicate types.
4683ed93c0SSanjay Patel
47*862e35e2SSanjay Patel; This is not fabs because that could produce a different signbit for a NAN input.
48*862e35e2SSanjay Patel; PR59279
49*862e35e2SSanjay Patel
50560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_ult(double %x) {
51560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_ult(
52*862e35e2SSanjay Patel; CHECK-NEXT:    [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00
53*862e35e2SSanjay Patel; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
54*862e35e2SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
55560dd1cdSUsman Nadeem; CHECK-NEXT:    ret double [[SEL]]
56560dd1cdSUsman Nadeem;
57560dd1cdSUsman Nadeem  %cmp = fcmp ult double %x, 0.000000e+00
58560dd1cdSUsman Nadeem  %negX = fneg double %x
59560dd1cdSUsman Nadeem  %sel = select nsz i1 %cmp, double %x, double %negX
60560dd1cdSUsman Nadeem  ret double %sel
61560dd1cdSUsman Nadeem}
62560dd1cdSUsman Nadeem
6383ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_ult(double %x) {
6483ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_ult(
6583ed93c0SSanjay Patel; CHECK-NEXT:    [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
6683ed93c0SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
6783ed93c0SSanjay Patel; CHECK-NEXT:    ret double [[SEL]]
6883ed93c0SSanjay Patel;
6983ed93c0SSanjay Patel  %cmp = fcmp ult double %x, 0.000000e+00
7083ed93c0SSanjay Patel  %negX = fneg double %x
7183ed93c0SSanjay Patel  %sel = select nsz nnan i1 %cmp, double %x, double %negX
7283ed93c0SSanjay Patel  ret double %sel
7383ed93c0SSanjay Patel}
7483ed93c0SSanjay Patel
75*862e35e2SSanjay Patel; This is not fabs because that could produce a different signbit for a NAN input.
76*862e35e2SSanjay Patel; PR59279
77*862e35e2SSanjay Patel
78560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_ole(double %x) {
79560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_ole(
80*862e35e2SSanjay Patel; CHECK-NEXT:    [[CMP:%.*]] = fcmp ole double [[X:%.*]], 0.000000e+00
81*862e35e2SSanjay Patel; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
82*862e35e2SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
83560dd1cdSUsman Nadeem; CHECK-NEXT:    ret double [[SEL]]
84560dd1cdSUsman Nadeem;
85560dd1cdSUsman Nadeem  %cmp = fcmp ole double %x, 0.000000e+00
86560dd1cdSUsman Nadeem  %negX = fneg double %x
87560dd1cdSUsman Nadeem  %sel = select nsz i1 %cmp, double %x, double %negX
88560dd1cdSUsman Nadeem  ret double %sel
89560dd1cdSUsman Nadeem}
90560dd1cdSUsman Nadeem
9183ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_ole(double %x) {
9283ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_ole(
9383ed93c0SSanjay Patel; CHECK-NEXT:    [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
9483ed93c0SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
9583ed93c0SSanjay Patel; CHECK-NEXT:    ret double [[SEL]]
9683ed93c0SSanjay Patel;
9783ed93c0SSanjay Patel  %cmp = fcmp ole double %x, 0.000000e+00
9883ed93c0SSanjay Patel  %negX = fneg double %x
9983ed93c0SSanjay Patel  %sel = select nsz nnan i1 %cmp, double %x, double %negX
10083ed93c0SSanjay Patel  ret double %sel
10183ed93c0SSanjay Patel}
10283ed93c0SSanjay Patel
103*862e35e2SSanjay Patel; This is not fabs because that could produce a different signbit for a NAN input.
104*862e35e2SSanjay Patel; PR59279
105*862e35e2SSanjay Patel
106560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_ule(double %x) {
107560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_ule(
108*862e35e2SSanjay Patel; CHECK-NEXT:    [[CMP:%.*]] = fcmp ule double [[X:%.*]], 0.000000e+00
109*862e35e2SSanjay Patel; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
110*862e35e2SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
111560dd1cdSUsman Nadeem; CHECK-NEXT:    ret double [[SEL]]
112560dd1cdSUsman Nadeem;
113560dd1cdSUsman Nadeem  %cmp = fcmp ule double %x, 0.000000e+00
114560dd1cdSUsman Nadeem  %negX = fneg double %x
115560dd1cdSUsman Nadeem  %sel = select nsz i1 %cmp, double %x, double %negX
116560dd1cdSUsman Nadeem  ret double %sel
117560dd1cdSUsman Nadeem}
118560dd1cdSUsman Nadeem
11983ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_ule(double %x) {
12083ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_ule(
12183ed93c0SSanjay Patel; CHECK-NEXT:    [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
12283ed93c0SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
12383ed93c0SSanjay Patel; CHECK-NEXT:    ret double [[SEL]]
12483ed93c0SSanjay Patel;
12583ed93c0SSanjay Patel  %cmp = fcmp ule double %x, 0.000000e+00
12683ed93c0SSanjay Patel  %negX = fneg double %x
12783ed93c0SSanjay Patel  %sel = select nsz nnan i1 %cmp, double %x, double %negX
12883ed93c0SSanjay Patel  ret double %sel
12983ed93c0SSanjay Patel}
13083ed93c0SSanjay Patel
131560dd1cdSUsman Nadeem; (X >  +/-0.0) ? -X : X --> -fabs(X)
132560dd1cdSUsman Nadeem; (X >= +/-0.0) ? -X : X --> -fabs(X)
133560dd1cdSUsman Nadeem; One negative test with no fmf
134560dd1cdSUsman Nadeemdefine double @select_noFMF_nfabs_gt(double %x) {
135560dd1cdSUsman Nadeem; CHECK-LABEL: @select_noFMF_nfabs_gt(
136560dd1cdSUsman Nadeem; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00
137560dd1cdSUsman Nadeem; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
138560dd1cdSUsman Nadeem; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], double [[NEGX]], double [[X]]
139560dd1cdSUsman Nadeem; CHECK-NEXT:    ret double [[SEL]]
140560dd1cdSUsman Nadeem;
141560dd1cdSUsman Nadeem  %cmp = fcmp ogt double %x, 0.000000e+00
142560dd1cdSUsman Nadeem  %negX = fneg double %x
143560dd1cdSUsman Nadeem  %sel = select i1 %cmp, double %negX, double %x
144560dd1cdSUsman Nadeem  ret double %sel
145560dd1cdSUsman Nadeem}
146560dd1cdSUsman Nadeem
147560dd1cdSUsman Nadeem; One test where the neg has fmfs.
148560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_gt_fmfProp(double %x) {
149560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_gt_fmfProp(
1500ee6bad6SSanjay Patel; CHECK-NEXT:    [[TMP1:%.*]] = call nnan ninf nsz double @llvm.fabs.f64(double [[X:%.*]])
1510ee6bad6SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = fneg nnan ninf nsz double [[TMP1]]
152560dd1cdSUsman Nadeem; CHECK-NEXT:    ret double [[SEL]]
153560dd1cdSUsman Nadeem;
154560dd1cdSUsman Nadeem  %cmp = fcmp ogt double %x, 0.000000e+00
155560dd1cdSUsman Nadeem  %negX = fneg fast double %x
156560dd1cdSUsman Nadeem  %sel = select nsz i1 %cmp, double %negX, double %x
157560dd1cdSUsman Nadeem  ret double %sel
158560dd1cdSUsman Nadeem}
159560dd1cdSUsman Nadeem
16083ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_gt_fmfProp(double %x) {
16183ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_gt_fmfProp(
1620ee6bad6SSanjay Patel; CHECK-NEXT:    [[TMP1:%.*]] = call nnan ninf nsz double @llvm.fabs.f64(double [[X:%.*]])
1630ee6bad6SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = fneg nnan ninf nsz double [[TMP1]]
16483ed93c0SSanjay Patel; CHECK-NEXT:    ret double [[SEL]]
16583ed93c0SSanjay Patel;
16683ed93c0SSanjay Patel  %cmp = fcmp ogt double %x, 0.000000e+00
16783ed93c0SSanjay Patel  %negX = fneg fast double %x
16883ed93c0SSanjay Patel  %sel = select nsz nnan i1 %cmp, double %negX, double %x
16983ed93c0SSanjay Patel  ret double %sel
17083ed93c0SSanjay Patel}
17183ed93c0SSanjay Patel
172*862e35e2SSanjay Patel; This is not fabs because that could produce a different signbit for a NAN input.
173*862e35e2SSanjay Patel; PR59279
174*862e35e2SSanjay Patel
175560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_ogt(double %x) {
176560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_ogt(
177*862e35e2SSanjay Patel; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00
178*862e35e2SSanjay Patel; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
179*862e35e2SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
180560dd1cdSUsman Nadeem; CHECK-NEXT:    ret double [[SEL]]
181560dd1cdSUsman Nadeem;
182560dd1cdSUsman Nadeem  %cmp = fcmp ogt double %x, 0.000000e+00
183560dd1cdSUsman Nadeem  %negX = fneg double %x
184560dd1cdSUsman Nadeem  %sel = select nsz i1 %cmp, double %negX, double %x
185560dd1cdSUsman Nadeem  ret double %sel
186560dd1cdSUsman Nadeem}
187560dd1cdSUsman Nadeem
188*862e35e2SSanjay Patel; Tests with various predicate types.
189*862e35e2SSanjay Patel
19083ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_ogt(double %x) {
19183ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_ogt(
19283ed93c0SSanjay Patel; CHECK-NEXT:    [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
19383ed93c0SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
19483ed93c0SSanjay Patel; CHECK-NEXT:    ret double [[SEL]]
19583ed93c0SSanjay Patel;
19683ed93c0SSanjay Patel  %cmp = fcmp ogt double %x, 0.000000e+00
19783ed93c0SSanjay Patel  %negX = fneg double %x
19883ed93c0SSanjay Patel  %sel = select nsz nnan i1 %cmp, double %negX, double %x
19983ed93c0SSanjay Patel  ret double %sel
20083ed93c0SSanjay Patel}
20183ed93c0SSanjay Patel
202*862e35e2SSanjay Patel; This is not fabs because that could produce a different signbit for a NAN input.
203*862e35e2SSanjay Patel; PR59279
204*862e35e2SSanjay Patel
205560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_ugt(double %x) {
206560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_ugt(
207*862e35e2SSanjay Patel; CHECK-NEXT:    [[CMP:%.*]] = fcmp ugt double [[X:%.*]], 0.000000e+00
208*862e35e2SSanjay Patel; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
209*862e35e2SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
210560dd1cdSUsman Nadeem; CHECK-NEXT:    ret double [[SEL]]
211560dd1cdSUsman Nadeem;
212560dd1cdSUsman Nadeem  %cmp = fcmp ugt double %x, 0.000000e+00
213560dd1cdSUsman Nadeem  %negX = fneg double %x
214560dd1cdSUsman Nadeem  %sel = select nsz i1 %cmp, double %negX, double %x
215560dd1cdSUsman Nadeem  ret double %sel
216560dd1cdSUsman Nadeem}
217560dd1cdSUsman Nadeem
21883ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_ugt(double %x) {
21983ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_ugt(
22083ed93c0SSanjay Patel; CHECK-NEXT:    [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
22183ed93c0SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
22283ed93c0SSanjay Patel; CHECK-NEXT:    ret double [[SEL]]
22383ed93c0SSanjay Patel;
22483ed93c0SSanjay Patel  %cmp = fcmp ugt double %x, 0.000000e+00
22583ed93c0SSanjay Patel  %negX = fneg double %x
22683ed93c0SSanjay Patel  %sel = select nsz nnan i1 %cmp, double %negX, double %x
22783ed93c0SSanjay Patel  ret double %sel
22883ed93c0SSanjay Patel}
22983ed93c0SSanjay Patel
230*862e35e2SSanjay Patel; This is not fabs because that could produce a different signbit for a NAN input.
231*862e35e2SSanjay Patel; PR59279
232*862e35e2SSanjay Patel
233560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_oge(double %x) {
234560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_oge(
235*862e35e2SSanjay Patel; CHECK-NEXT:    [[CMP:%.*]] = fcmp oge double [[X:%.*]], 0.000000e+00
236*862e35e2SSanjay Patel; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
237*862e35e2SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
238560dd1cdSUsman Nadeem; CHECK-NEXT:    ret double [[SEL]]
239560dd1cdSUsman Nadeem;
240560dd1cdSUsman Nadeem  %cmp = fcmp oge double %x, 0.000000e+00
241560dd1cdSUsman Nadeem  %negX = fneg double %x
242560dd1cdSUsman Nadeem  %sel = select nsz i1 %cmp, double %negX, double %x
243560dd1cdSUsman Nadeem  ret double %sel
244560dd1cdSUsman Nadeem}
245560dd1cdSUsman Nadeem
24683ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_oge(double %x) {
24783ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_oge(
24883ed93c0SSanjay Patel; CHECK-NEXT:    [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
24983ed93c0SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
25083ed93c0SSanjay Patel; CHECK-NEXT:    ret double [[SEL]]
25183ed93c0SSanjay Patel;
25283ed93c0SSanjay Patel  %cmp = fcmp oge double %x, 0.000000e+00
25383ed93c0SSanjay Patel  %negX = fneg double %x
25483ed93c0SSanjay Patel  %sel = select nsz nnan i1 %cmp, double %negX, double %x
25583ed93c0SSanjay Patel  ret double %sel
25683ed93c0SSanjay Patel}
25783ed93c0SSanjay Patel
258*862e35e2SSanjay Patel; This is not fabs because that could produce a different signbit for a NAN input.
259*862e35e2SSanjay Patel; PR59279
260*862e35e2SSanjay Patel
261560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_uge(double %x) {
262560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_uge(
263*862e35e2SSanjay Patel; CHECK-NEXT:    [[CMP:%.*]] = fcmp uge double [[X:%.*]], 0.000000e+00
264*862e35e2SSanjay Patel; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
265*862e35e2SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
266560dd1cdSUsman Nadeem; CHECK-NEXT:    ret double [[SEL]]
267560dd1cdSUsman Nadeem;
268560dd1cdSUsman Nadeem  %cmp = fcmp uge double %x, 0.000000e+00
269560dd1cdSUsman Nadeem  %negX = fneg double %x
270560dd1cdSUsman Nadeem  %sel = select nsz i1 %cmp, double %negX, double %x
271560dd1cdSUsman Nadeem  ret double %sel
272560dd1cdSUsman Nadeem}
273560dd1cdSUsman Nadeem
27483ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_uge(double %x) {
27583ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_uge(
27683ed93c0SSanjay Patel; CHECK-NEXT:    [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
27783ed93c0SSanjay Patel; CHECK-NEXT:    [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
27883ed93c0SSanjay Patel; CHECK-NEXT:    ret double [[SEL]]
27983ed93c0SSanjay Patel;
28083ed93c0SSanjay Patel  %cmp = fcmp uge double %x, 0.000000e+00
28183ed93c0SSanjay Patel  %negX = fneg double %x
28283ed93c0SSanjay Patel  %sel = select nsz nnan i1 %cmp, double %negX, double %x
28383ed93c0SSanjay Patel  ret double %sel
28483ed93c0SSanjay Patel}
28583ed93c0SSanjay Patel
286560dd1cdSUsman Nadeem; (X < +/-0.0) ? X : (0.0 - X) --> (0.0 - fabs(X))
287560dd1cdSUsman Nadeem; One negative test with <=.
288560dd1cdSUsman Nadeemdefine double @select_noFMF_fsubfabs_le(double %x) {
289560dd1cdSUsman Nadeem; CHECK-LABEL: @select_noFMF_fsubfabs_le(
290560dd1cdSUsman Nadeem; CHECK-NEXT:    [[CMP:%.*]] = fcmp ole double [[X:%.*]], 0.000000e+00
291560dd1cdSUsman Nadeem; CHECK-NEXT:    [[SUB:%.*]] = fsub double 0.000000e+00, [[X]]
292560dd1cdSUsman Nadeem; CHECK-NEXT:    [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[SUB]]
293560dd1cdSUsman Nadeem; CHECK-NEXT:    ret double [[RETVAL_0]]
294560dd1cdSUsman Nadeem;
295560dd1cdSUsman Nadeem  %cmp = fcmp ole double %x, 0.000000e+00
296560dd1cdSUsman Nadeem  %sub = fsub double 0.000000e+00, %x
297560dd1cdSUsman Nadeem  %retval.0 = select i1 %cmp, double %x, double %sub
298560dd1cdSUsman Nadeem  ret double %retval.0
299560dd1cdSUsman Nadeem}
300560dd1cdSUsman Nadeem
301560dd1cdSUsman Nadeemdefine double @select_noFMF_fsubfabs_olt(double %x) {
302560dd1cdSUsman Nadeem; CHECK-LABEL: @select_noFMF_fsubfabs_olt(
303560dd1cdSUsman Nadeem; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00
304560dd1cdSUsman Nadeem; CHECK-NEXT:    [[SUB:%.*]] = fsub double 0.000000e+00, [[X]]
305560dd1cdSUsman Nadeem; CHECK-NEXT:    [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[SUB]]
306560dd1cdSUsman Nadeem; CHECK-NEXT:    ret double [[RETVAL_0]]
307560dd1cdSUsman Nadeem;
308560dd1cdSUsman Nadeem  %cmp = fcmp olt double %x, 0.000000e+00
309560dd1cdSUsman Nadeem  %sub = fsub double 0.000000e+00, %x
310560dd1cdSUsman Nadeem  %retval.0 = select i1 %cmp, double %x, double %sub
311560dd1cdSUsman Nadeem  ret double %retval.0
312560dd1cdSUsman Nadeem}
313560dd1cdSUsman Nadeem
314560dd1cdSUsman Nadeemdefine double @select_noFMF_fsubfabs_ult(double %x) {
315560dd1cdSUsman Nadeem; CHECK-LABEL: @select_noFMF_fsubfabs_ult(
316560dd1cdSUsman Nadeem; CHECK-NEXT:    [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00
317560dd1cdSUsman Nadeem; CHECK-NEXT:    [[SUB:%.*]] = fsub double 0.000000e+00, [[X]]
318560dd1cdSUsman Nadeem; CHECK-NEXT:    [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[SUB]]
319560dd1cdSUsman Nadeem; CHECK-NEXT:    ret double [[RETVAL_0]]
320560dd1cdSUsman Nadeem;
321560dd1cdSUsman Nadeem  %cmp = fcmp ult double %x, 0.000000e+00
322560dd1cdSUsman Nadeem  %sub = fsub double 0.000000e+00, %x
323560dd1cdSUsman Nadeem  %retval.0 = select i1 %cmp, double %x, double %sub
324560dd1cdSUsman Nadeem  ret double %retval.0
325560dd1cdSUsman Nadeem}
326560dd1cdSUsman Nadeem
327560dd1cdSUsman Nadeem
328560dd1cdSUsman Nadeem; With nsz:
329560dd1cdSUsman Nadeem; (X < +/-0.0) ? X : -X --> -fabs(X)
330560dd1cdSUsman Nadeemdefine double @select_nsz_fnegfabs_olt(double %x) {
331560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_fnegfabs_olt(
332560dd1cdSUsman Nadeem; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00
333560dd1cdSUsman Nadeem; CHECK-NEXT:    [[NEGX:%.*]] = fneg nsz double [[X]]
334560dd1cdSUsman Nadeem; CHECK-NEXT:    [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]]
335560dd1cdSUsman Nadeem; CHECK-NEXT:    ret double [[RETVAL_0]]
336560dd1cdSUsman Nadeem;
337560dd1cdSUsman Nadeem  %cmp = fcmp olt double %x, 0.000000e+00
338560dd1cdSUsman Nadeem  %negX = fneg nsz double %x
339560dd1cdSUsman Nadeem  %retval.0 = select i1 %cmp, double %x, double %negX
340560dd1cdSUsman Nadeem  ret double %retval.0
341560dd1cdSUsman Nadeem}
342560dd1cdSUsman Nadeem
343560dd1cdSUsman Nadeemdefine double @select_nsz_fnegfabs_ult(double %x) {
344560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_fnegfabs_ult(
345560dd1cdSUsman Nadeem; CHECK-NEXT:    [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00
346560dd1cdSUsman Nadeem; CHECK-NEXT:    [[NEGX:%.*]] = fneg nsz double [[X]]
347560dd1cdSUsman Nadeem; CHECK-NEXT:    [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]]
348560dd1cdSUsman Nadeem; CHECK-NEXT:    ret double [[RETVAL_0]]
349560dd1cdSUsman Nadeem;
350560dd1cdSUsman Nadeem  %cmp = fcmp ult double %x, 0.000000e+00
351560dd1cdSUsman Nadeem  %negX = fneg nsz double %x
352560dd1cdSUsman Nadeem  %retval.0 = select i1 %cmp, double %x, double %negX
353560dd1cdSUsman Nadeem  ret double %retval.0
354560dd1cdSUsman Nadeem}
355