[sanitizer] Improve FreeBSD ASLR detection
[llvm-project.git] / llvm / test / Transforms / InstCombine / powi.ll
blob54bf33f4e5e4f8ba2c84450ccb35d7957ad64624
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -instcombine -S < %s | FileCheck %s
4 declare double @llvm.powi.f64.i32(double, i32)
5 declare double @llvm.powi.f64.i64(double, i64)
6 declare double @llvm.fabs.f64(double)
7 declare double @llvm.copysign.f64(double, double)
8 declare void @use(double)
10 define double @powi_fneg_even_int(double %x) {
11 ; CHECK-LABEL: @powi_fneg_even_int(
12 ; CHECK-NEXT:  entry:
13 ; CHECK-NEXT:    [[R:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 4)
14 ; CHECK-NEXT:    ret double [[R]]
16 entry:
17   %fneg = fneg double %x
18   %r = tail call double @llvm.powi.f64.i32(double %fneg, i32 4)
19   ret double %r
22 define double @powi_fabs_even_int(double %x) {
23 ; CHECK-LABEL: @powi_fabs_even_int(
24 ; CHECK-NEXT:  entry:
25 ; CHECK-NEXT:    [[R:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 4)
26 ; CHECK-NEXT:    ret double [[R]]
28 entry:
29   %f = tail call double @llvm.fabs.f64(double %x)
30   %r = tail call double @llvm.powi.f64.i32(double %f, i32 4)
31   ret double %r
34 define double @powi_copysign_even_int(double %x, double %y) {
35 ; CHECK-LABEL: @powi_copysign_even_int(
36 ; CHECK-NEXT:  entry:
37 ; CHECK-NEXT:    [[R:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 4)
38 ; CHECK-NEXT:    ret double [[R]]
40 entry:
41   %cs = tail call double @llvm.copysign.f64(double %x, double %y)
42   %r = tail call double @llvm.powi.f64.i32(double %cs, i32 4)
43   ret double %r
46 define double @powi_fneg_odd_int(double %x) {
47 ; CHECK-LABEL: @powi_fneg_odd_int(
48 ; CHECK-NEXT:  entry:
49 ; CHECK-NEXT:    [[FNEG:%.*]] = fneg double [[X:%.*]]
50 ; CHECK-NEXT:    [[R:%.*]] = tail call double @llvm.powi.f64.i32(double [[FNEG]], i32 5)
51 ; CHECK-NEXT:    ret double [[R]]
53 entry:
54   %fneg = fneg double %x
55   %r = tail call double @llvm.powi.f64.i32(double %fneg, i32 5)
56   ret double %r
59 define double @powi_fabs_odd_int(double %x) {
60 ; CHECK-LABEL: @powi_fabs_odd_int(
61 ; CHECK-NEXT:  entry:
62 ; CHECK-NEXT:    [[F:%.*]] = tail call double @llvm.fabs.f64(double [[X:%.*]])
63 ; CHECK-NEXT:    [[R:%.*]] = tail call double @llvm.powi.f64.i32(double [[F]], i32 5)
64 ; CHECK-NEXT:    ret double [[R]]
66 entry:
67   %f = tail call double @llvm.fabs.f64(double %x)
68   %r = tail call double @llvm.powi.f64.i32(double %f, i32 5)
69   ret double %r
72 define double @powi_copysign_odd_int(double %x, double %y) {
73 ; CHECK-LABEL: @powi_copysign_odd_int(
74 ; CHECK-NEXT:  entry:
75 ; CHECK-NEXT:    [[CS:%.*]] = tail call double @llvm.copysign.f64(double [[X:%.*]], double [[Y:%.*]])
76 ; CHECK-NEXT:    [[R:%.*]] = tail call double @llvm.powi.f64.i32(double [[CS]], i32 5)
77 ; CHECK-NEXT:    ret double [[R]]
79 entry:
80   %cs = tail call double @llvm.copysign.f64(double %x, double %y)
81   %r = tail call double @llvm.powi.f64.i32(double %cs, i32 5)
82   ret double %r
85 define double @powi_fmul_arg0_no_reassoc(double %x, i32 %i) {
86 ; CHECK-LABEL: @powi_fmul_arg0_no_reassoc(
87 ; CHECK-NEXT:  entry:
88 ; CHECK-NEXT:    [[POW:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[I:%.*]])
89 ; CHECK-NEXT:    [[MUL:%.*]] = fmul double [[POW]], [[X]]
90 ; CHECK-NEXT:    ret double [[MUL]]
92 entry:
93   %pow = tail call double @llvm.powi.f64.i32(double %x, i32 %i)
94   %mul = fmul double %pow, %x
95   ret double %mul
99 define double @powi_fmul_arg0(double %x, i32 %i) {
100 ; CHECK-LABEL: @powi_fmul_arg0(
101 ; CHECK-NEXT:  entry:
102 ; CHECK-NEXT:    [[POW:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[I:%.*]])
103 ; CHECK-NEXT:    [[MUL:%.*]] = fmul reassoc double [[POW]], [[X]]
104 ; CHECK-NEXT:    ret double [[MUL]]
106 entry:
107   %pow = tail call double @llvm.powi.f64.i32(double %x, i32 %i)
108   %mul = fmul reassoc double %pow, %x
109   ret double %mul
112 define double @powi_fmul_arg0_use(double %x, i32 %i) {
113 ; CHECK-LABEL: @powi_fmul_arg0_use(
114 ; CHECK-NEXT:  entry:
115 ; CHECK-NEXT:    [[POW:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[I:%.*]])
116 ; CHECK-NEXT:    tail call void @use(double [[POW]])
117 ; CHECK-NEXT:    [[MUL:%.*]] = fmul reassoc double [[POW]], [[X]]
118 ; CHECK-NEXT:    ret double [[MUL]]
120 entry:
121   %pow = tail call double @llvm.powi.f64.i32(double %x, i32 %i)
122   tail call void @use(double %pow)
123   %mul = fmul reassoc double %pow, %x
124   ret double %mul
127 define double @powi_fmul_powi_no_reassoc(double %x, i32 %y, i32 %z) {
128 ; CHECK-LABEL: @powi_fmul_powi_no_reassoc(
129 ; CHECK-NEXT:  entry:
130 ; CHECK-NEXT:    [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
131 ; CHECK-NEXT:    [[P2:%.*]] = tail call double @llvm.powi.f64.i32(double [[X]], i32 [[Z:%.*]])
132 ; CHECK-NEXT:    [[MUL:%.*]] = fmul double [[P2]], [[P1]]
133 ; CHECK-NEXT:    ret double [[MUL]]
135 entry:
136   %p1 = tail call double @llvm.powi.f64.i32(double %x, i32 %y)
137   %p2 = tail call double @llvm.powi.f64.i32(double %x, i32 %z)
138   %mul = fmul double %p2, %p1
139   ret double %mul
143 define double @powi_fmul_powi(double %x, i32 %y, i32 %z) {
144 ; CHECK-LABEL: @powi_fmul_powi(
145 ; CHECK-NEXT:  entry:
146 ; CHECK-NEXT:    [[TMP0:%.*]] = add i32 [[Z:%.*]], [[Y:%.*]]
147 ; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[TMP0]])
148 ; CHECK-NEXT:    ret double [[TMP1]]
150 entry:
151   %p1 = tail call double @llvm.powi.f64.i32(double %x, i32 %y)
152   %p2 = tail call double @llvm.powi.f64.i32(double %x, i32 %z)
153   %mul = fmul reassoc double %p2, %p1
154   ret double %mul
157 define double @powi_fmul_powi_fast_on_fmul(double %x, i32 %y, i32 %z) {
158 ; CHECK-LABEL: @powi_fmul_powi_fast_on_fmul(
159 ; CHECK-NEXT:  entry:
160 ; CHECK-NEXT:    [[TMP0:%.*]] = add i32 [[Z:%.*]], [[Y:%.*]]
161 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[TMP0]])
162 ; CHECK-NEXT:    ret double [[TMP1]]
164 entry:
165   %p1 = tail call double @llvm.powi.f64.i32(double %x, i32 %y)
166   %p2 = tail call double @llvm.powi.f64.i32(double %x, i32 %z)
167   %mul = fmul fast double %p2, %p1
168   ret double %mul
171 define double @powi_fmul_powi_fast_on_powi(double %x, i32 %y, i32 %z) {
172 ; CHECK-LABEL: @powi_fmul_powi_fast_on_powi(
173 ; CHECK-NEXT:  entry:
174 ; CHECK-NEXT:    [[P1:%.*]] = tail call fast double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
175 ; CHECK-NEXT:    [[P2:%.*]] = tail call fast double @llvm.powi.f64.i32(double [[X]], i32 [[Z:%.*]])
176 ; CHECK-NEXT:    [[MUL:%.*]] = fmul double [[P2]], [[P1]]
177 ; CHECK-NEXT:    ret double [[MUL]]
179 entry:
180   %p1 = tail call fast double @llvm.powi.f64.i32(double %x, i32 %y)
181   %p2 = tail call fast double @llvm.powi.f64.i32(double %x, i32 %z)
182   %mul = fmul double %p2, %p1
183   ret double %mul
186 define double @powi_fmul_powi_same_power(double %x, i32 %y, i32 %z) {
187 ; CHECK-LABEL: @powi_fmul_powi_same_power(
188 ; CHECK-NEXT:  entry:
189 ; CHECK-NEXT:    [[TMP0:%.*]] = shl i32 [[Y:%.*]], 1
190 ; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[TMP0]])
191 ; CHECK-NEXT:    ret double [[TMP1]]
193 entry:
194   %p1 = tail call double @llvm.powi.f64.i32(double %x, i32 %y)
195   %p2 = tail call double @llvm.powi.f64.i32(double %x, i32 %y)
196   %mul = fmul reassoc double %p2, %p1
197   ret double %mul
200 define double @powi_fmul_powi_use_first(double %x, i32 %y, i32 %z) {
201 ; CHECK-LABEL: @powi_fmul_powi_use_first(
202 ; CHECK-NEXT:  entry:
203 ; CHECK-NEXT:    [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
204 ; CHECK-NEXT:    tail call void @use(double [[P1]])
205 ; CHECK-NEXT:    [[TMP0:%.*]] = add i32 [[Y]], [[Z:%.*]]
206 ; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.powi.f64.i32(double [[X]], i32 [[TMP0]])
207 ; CHECK-NEXT:    ret double [[TMP1]]
209 entry:
210   %p1 = tail call double @llvm.powi.f64.i32(double %x, i32 %y)
211   tail call void @use(double %p1)
212   %p2 = tail call double @llvm.powi.f64.i32(double %x, i32 %z)
213   %mul = fmul reassoc double %p1, %p2
214   ret double %mul
217 define double @powi_fmul_powi_use_second(double %x, i32 %y, i32 %z) {
218 ; CHECK-LABEL: @powi_fmul_powi_use_second(
219 ; CHECK-NEXT:  entry:
220 ; CHECK-NEXT:    [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Z:%.*]])
221 ; CHECK-NEXT:    tail call void @use(double [[P1]])
222 ; CHECK-NEXT:    [[TMP0:%.*]] = add i32 [[Y:%.*]], [[Z]]
223 ; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.powi.f64.i32(double [[X]], i32 [[TMP0]])
224 ; CHECK-NEXT:    ret double [[TMP1]]
226 entry:
227   %p1 = tail call double @llvm.powi.f64.i32(double %x, i32 %z)
228   tail call void @use(double %p1)
229   %p2 = tail call double @llvm.powi.f64.i32(double %x, i32 %y)
230   %mul = fmul reassoc double %p2, %p1
231   ret double %mul
234 define double @powi_fmul_different_base(double %x, double %m, i32 %y, i32 %z) {
235 ; CHECK-LABEL: @powi_fmul_different_base(
236 ; CHECK-NEXT:  entry:
237 ; CHECK-NEXT:    [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
238 ; CHECK-NEXT:    [[P2:%.*]] = tail call double @llvm.powi.f64.i32(double [[M:%.*]], i32 [[Z:%.*]])
239 ; CHECK-NEXT:    [[MUL:%.*]] = fmul reassoc double [[P2]], [[P1]]
240 ; CHECK-NEXT:    ret double [[MUL]]
242 entry:
243   %p1 = tail call double @llvm.powi.f64.i32(double %x, i32 %y)
244   %p2 = tail call double @llvm.powi.f64.i32(double %m, i32 %z)
245   %mul = fmul reassoc double %p2, %p1
246   ret double %mul
249 define double @different_types_powi(double %x, i32 %y, i64 %z) {
250 ; CHECK-LABEL: @different_types_powi(
251 ; CHECK-NEXT:    [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
252 ; CHECK-NEXT:    [[P2:%.*]] = tail call double @llvm.powi.f64.i64(double [[X]], i64 [[Z:%.*]])
253 ; CHECK-NEXT:    [[MUL:%.*]] = fmul reassoc double [[P2]], [[P1]]
254 ; CHECK-NEXT:    ret double [[MUL]]
256   %p1 = tail call double @llvm.powi.f64.i32(double %x, i32 %y)
257   %p2 = tail call double @llvm.powi.f64.i64(double %x, i64 %z)
258   %mul = fmul reassoc double %p2, %p1
259   ret double %mul