[sanitizer] Improve FreeBSD ASLR detection
[llvm-project.git] / llvm / test / Transforms / InstCombine / fneg-fabs.ll
blobcb2e440dbbc8dbce8ef97609078bf9505a6365e1
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instcombine -S | FileCheck %s
4 ; (X <  +/-0.0) ? X : -X --> -fabs(X)
5 ; (X <= +/-0.0) ? X : -X --> -fabs(X)
6 ; One negative test with no fmf
7 define double @select_noFMF_nfabs_lt(double %x) {
8 ; CHECK-LABEL: @select_noFMF_nfabs_lt(
9 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00
10 ; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
11 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]]
12 ; CHECK-NEXT:    ret double [[SEL]]
14   %cmp = fcmp olt double %x, 0.000000e+00
15   %negX = fneg double %x
16   %sel = select i1 %cmp, double %x, double %negX
17   ret double %sel
20 ; One test where the neg has fmfs.
21 define double @select_nsz_nfabs_lt_fmfProp(double %x) {
22 ; CHECK-LABEL: @select_nsz_nfabs_lt_fmfProp(
23 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00
24 ; CHECK-NEXT:    [[NEGX:%.*]] = fneg fast double [[X]]
25 ; CHECK-NEXT:    [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
26 ; CHECK-NEXT:    ret double [[SEL]]
28   %cmp = fcmp olt double %x, 0.000000e+00
29   %negX = fneg fast double %x
30   %sel = select nsz i1 %cmp, double %x, double %negX
31   ret double %sel
34 ; Tests with various predicate types.
35 define double @select_nsz_nfabs_olt(double %x) {
36 ; CHECK-LABEL: @select_nsz_nfabs_olt(
37 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00
38 ; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
39 ; CHECK-NEXT:    [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
40 ; CHECK-NEXT:    ret double [[SEL]]
42   %cmp = fcmp olt double %x, 0.000000e+00
43   %negX = fneg double %x
44   %sel = select nsz i1 %cmp, double %x, double %negX
45   ret double %sel
48 define double @select_nsz_nfabs_ult(double %x) {
49 ; CHECK-LABEL: @select_nsz_nfabs_ult(
50 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00
51 ; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
52 ; CHECK-NEXT:    [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
53 ; CHECK-NEXT:    ret double [[SEL]]
55   %cmp = fcmp ult double %x, 0.000000e+00
56   %negX = fneg double %x
57   %sel = select nsz i1 %cmp, double %x, double %negX
58   ret double %sel
61 define double @select_nsz_nfabs_ole(double %x) {
62 ; CHECK-LABEL: @select_nsz_nfabs_ole(
63 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp ole double [[X:%.*]], 0.000000e+00
64 ; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
65 ; CHECK-NEXT:    [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
66 ; CHECK-NEXT:    ret double [[SEL]]
68   %cmp = fcmp ole double %x, 0.000000e+00
69   %negX = fneg double %x
70   %sel = select nsz i1 %cmp, double %x, double %negX
71   ret double %sel
74 define double @select_nsz_nfabs_ule(double %x) {
75 ; CHECK-LABEL: @select_nsz_nfabs_ule(
76 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp ule double [[X:%.*]], 0.000000e+00
77 ; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
78 ; CHECK-NEXT:    [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
79 ; CHECK-NEXT:    ret double [[SEL]]
81   %cmp = fcmp ule double %x, 0.000000e+00
82   %negX = fneg double %x
83   %sel = select nsz i1 %cmp, double %x, double %negX
84   ret double %sel
87 ; (X >  +/-0.0) ? -X : X --> -fabs(X)
88 ; (X >= +/-0.0) ? -X : X --> -fabs(X)
89 ; One negative test with no fmf
90 define double @select_noFMF_nfabs_gt(double %x) {
91 ; CHECK-LABEL: @select_noFMF_nfabs_gt(
92 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00
93 ; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
94 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], double [[NEGX]], double [[X]]
95 ; CHECK-NEXT:    ret double [[SEL]]
97   %cmp = fcmp ogt double %x, 0.000000e+00
98   %negX = fneg double %x
99   %sel = select i1 %cmp, double %negX, double %x
100   ret double %sel
103 ; One test where the neg has fmfs.
104 define double @select_nsz_nfabs_gt_fmfProp(double %x) {
105 ; CHECK-LABEL: @select_nsz_nfabs_gt_fmfProp(
106 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00
107 ; CHECK-NEXT:    [[NEGX:%.*]] = fneg fast double [[X]]
108 ; CHECK-NEXT:    [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
109 ; CHECK-NEXT:    ret double [[SEL]]
111   %cmp = fcmp ogt double %x, 0.000000e+00
112   %negX = fneg fast double %x
113   %sel = select nsz i1 %cmp, double %negX, double %x
114   ret double %sel
117 ; Tests with various predicate types.
118 define double @select_nsz_nfabs_ogt(double %x) {
119 ; CHECK-LABEL: @select_nsz_nfabs_ogt(
120 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00
121 ; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
122 ; CHECK-NEXT:    [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
123 ; CHECK-NEXT:    ret double [[SEL]]
125   %cmp = fcmp ogt double %x, 0.000000e+00
126   %negX = fneg double %x
127   %sel = select nsz i1 %cmp, double %negX, double %x
128   ret double %sel
131 define double @select_nsz_nfabs_ugt(double %x) {
132 ; CHECK-LABEL: @select_nsz_nfabs_ugt(
133 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp ugt double [[X:%.*]], 0.000000e+00
134 ; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
135 ; CHECK-NEXT:    [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
136 ; CHECK-NEXT:    ret double [[SEL]]
138   %cmp = fcmp ugt double %x, 0.000000e+00
139   %negX = fneg double %x
140   %sel = select nsz i1 %cmp, double %negX, double %x
141   ret double %sel
144 define double @select_nsz_nfabs_oge(double %x) {
145 ; CHECK-LABEL: @select_nsz_nfabs_oge(
146 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp oge double [[X:%.*]], 0.000000e+00
147 ; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
148 ; CHECK-NEXT:    [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
149 ; CHECK-NEXT:    ret double [[SEL]]
151   %cmp = fcmp oge double %x, 0.000000e+00
152   %negX = fneg double %x
153   %sel = select nsz i1 %cmp, double %negX, double %x
154   ret double %sel
157 define double @select_nsz_nfabs_uge(double %x) {
158 ; CHECK-LABEL: @select_nsz_nfabs_uge(
159 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp uge double [[X:%.*]], 0.000000e+00
160 ; CHECK-NEXT:    [[NEGX:%.*]] = fneg double [[X]]
161 ; CHECK-NEXT:    [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
162 ; CHECK-NEXT:    ret double [[SEL]]
164   %cmp = fcmp uge double %x, 0.000000e+00
165   %negX = fneg double %x
166   %sel = select nsz i1 %cmp, double %negX, double %x
167   ret double %sel
170 ; (X < +/-0.0) ? X : (0.0 - X) --> (0.0 - fabs(X))
171 ; One negative test with <=.
172 define double @select_noFMF_fsubfabs_le(double %x) {
173 ; CHECK-LABEL: @select_noFMF_fsubfabs_le(
174 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp ole double [[X:%.*]], 0.000000e+00
175 ; CHECK-NEXT:    [[SUB:%.*]] = fsub double 0.000000e+00, [[X]]
176 ; CHECK-NEXT:    [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[SUB]]
177 ; CHECK-NEXT:    ret double [[RETVAL_0]]
179   %cmp = fcmp ole double %x, 0.000000e+00
180   %sub = fsub double 0.000000e+00, %x
181   %retval.0 = select i1 %cmp, double %x, double %sub
182   ret double %retval.0
185 define double @select_noFMF_fsubfabs_olt(double %x) {
186 ; CHECK-LABEL: @select_noFMF_fsubfabs_olt(
187 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00
188 ; CHECK-NEXT:    [[SUB:%.*]] = fsub double 0.000000e+00, [[X]]
189 ; CHECK-NEXT:    [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[SUB]]
190 ; CHECK-NEXT:    ret double [[RETVAL_0]]
192   %cmp = fcmp olt double %x, 0.000000e+00
193   %sub = fsub double 0.000000e+00, %x
194   %retval.0 = select i1 %cmp, double %x, double %sub
195   ret double %retval.0
198 define double @select_noFMF_fsubfabs_ult(double %x) {
199 ; CHECK-LABEL: @select_noFMF_fsubfabs_ult(
200 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00
201 ; CHECK-NEXT:    [[SUB:%.*]] = fsub double 0.000000e+00, [[X]]
202 ; CHECK-NEXT:    [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[SUB]]
203 ; CHECK-NEXT:    ret double [[RETVAL_0]]
205   %cmp = fcmp ult double %x, 0.000000e+00
206   %sub = fsub double 0.000000e+00, %x
207   %retval.0 = select i1 %cmp, double %x, double %sub
208   ret double %retval.0
212 ; With nsz:
213 ; (X < +/-0.0) ? X : -X --> -fabs(X)
214 define double @select_nsz_fnegfabs_olt(double %x) {
215 ; CHECK-LABEL: @select_nsz_fnegfabs_olt(
216 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00
217 ; CHECK-NEXT:    [[NEGX:%.*]] = fneg nsz double [[X]]
218 ; CHECK-NEXT:    [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]]
219 ; CHECK-NEXT:    ret double [[RETVAL_0]]
221   %cmp = fcmp olt double %x, 0.000000e+00
222   %negX = fneg nsz double %x
223   %retval.0 = select i1 %cmp, double %x, double %negX
224   ret double %retval.0
227 define double @select_nsz_fnegfabs_ult(double %x) {
228 ; CHECK-LABEL: @select_nsz_fnegfabs_ult(
229 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00
230 ; CHECK-NEXT:    [[NEGX:%.*]] = fneg nsz double [[X]]
231 ; CHECK-NEXT:    [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]]
232 ; CHECK-NEXT:    ret double [[RETVAL_0]]
234   %cmp = fcmp ult double %x, 0.000000e+00
235   %negX = fneg nsz double %x
236   %retval.0 = select i1 %cmp, double %x, double %negX
237   ret double %retval.0