xref: /llvm-project/llvm/test/Transforms/InstSimplify/log-exp-intrinsic.ll (revision 5dcd6669ffdd03ca0adae5eda747ef68ed188d24)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
3
4declare double @llvm.log.f64(double)
5declare double @llvm.exp.f64(double)
6declare double @llvm.log2.f64(double)
7declare double @llvm.exp2.f64(double)
8declare double @llvm.log10.f64(double)
9declare double @llvm.exp10.f64(double)
10
11define double @log_reassoc_exp_strict(double %a) {
12; CHECK-LABEL: @log_reassoc_exp_strict(
13; CHECK-NEXT:    ret double [[A:%.*]]
14;
15  %1 = call double @llvm.exp.f64(double %a)
16  %2 = call reassoc double @llvm.log.f64(double %1)
17  ret double %2
18}
19
20define double @log_strict_exp_reassoc(double %a) {
21; CHECK-LABEL: @log_strict_exp_reassoc(
22; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.exp.f64(double [[A:%.*]])
23; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.log.f64(double [[TMP1]])
24; CHECK-NEXT:    ret double [[TMP2]]
25;
26  %1 = call reassoc double @llvm.exp.f64(double %a)
27  %2 = call double @llvm.log.f64(double %1)
28  ret double %2
29}
30
31define double @log_exp_log_exp(double %a) {
32; CHECK-LABEL: @log_exp_log_exp(
33; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.exp.f64(double [[A:%.*]])
34; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.log.f64(double [[TMP1]])
35; CHECK-NEXT:    [[TMP3:%.*]] = call double @llvm.exp.f64(double [[TMP2]])
36; CHECK-NEXT:    [[TMP4:%.*]] = call double @llvm.log.f64(double [[TMP3]])
37; CHECK-NEXT:    ret double [[TMP4]]
38;
39  %1 = call double @llvm.exp.f64(double %a)
40  %2 = call double @llvm.log.f64(double %1)
41  %3 = call double @llvm.exp.f64(double %2)
42  %4 = call double @llvm.log.f64(double %3)
43  ret double %4
44}
45
46define double @log_exp_log_exp_reassoc(double %a) {
47; CHECK-LABEL: @log_exp_log_exp_reassoc(
48; CHECK-NEXT:    ret double [[A:%.*]]
49;
50  %1 = call double @llvm.exp.f64(double %a)
51  %2 = call reassoc double @llvm.log.f64(double %1)
52  %3 = call double @llvm.exp.f64(double %2)
53  %4 = call reassoc double @llvm.log.f64(double %3)
54  ret double %4
55}
56
57define double @log2_reassoc_exp2_strict(double %a) {
58; CHECK-LABEL: @log2_reassoc_exp2_strict(
59; CHECK-NEXT:    ret double [[A:%.*]]
60;
61  %1 = call double @llvm.exp2.f64(double %a)
62  %2 = call reassoc double @llvm.log2.f64(double %1)
63  ret double %2
64}
65
66define double @log2_strict_exp2_reassoc(double %a) {
67; CHECK-LABEL: @log2_strict_exp2_reassoc(
68; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.exp2.f64(double [[A:%.*]])
69; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.log2.f64(double [[TMP1]])
70; CHECK-NEXT:    ret double [[TMP2]]
71;
72  %1 = call reassoc double @llvm.exp2.f64(double %a)
73  %2 = call double @llvm.log2.f64(double %1)
74  ret double %2
75}
76
77define double @log2_exp2_log2_exp2(double %a) {
78; CHECK-LABEL: @log2_exp2_log2_exp2(
79; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.exp2.f64(double [[A:%.*]])
80; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.log2.f64(double [[TMP1]])
81; CHECK-NEXT:    [[TMP3:%.*]] = call double @llvm.exp2.f64(double [[TMP2]])
82; CHECK-NEXT:    [[TMP4:%.*]] = call double @llvm.log2.f64(double [[TMP3]])
83; CHECK-NEXT:    ret double [[TMP4]]
84;
85  %1 = call double @llvm.exp2.f64(double %a)
86  %2 = call double @llvm.log2.f64(double %1)
87  %3 = call double @llvm.exp2.f64(double %2)
88  %4 = call double @llvm.log2.f64(double %3)
89  ret double %4
90}
91
92define double @log2_exp2_log2_exp2_reassoc(double %a) {
93; CHECK-LABEL: @log2_exp2_log2_exp2_reassoc(
94; CHECK-NEXT:    ret double [[A:%.*]]
95;
96  %1 = call double @llvm.exp2.f64(double %a)
97  %2 = call reassoc double @llvm.log2.f64(double %1)
98  %3 = call double @llvm.exp2.f64(double %2)
99  %4 = call reassoc double @llvm.log2.f64(double %3)
100  ret double %4
101}
102
103define double @exp_reassoc_log_strict(double %a) {
104; CHECK-LABEL: @exp_reassoc_log_strict(
105; CHECK-NEXT:    ret double [[A:%.*]]
106;
107  %1 = call double @llvm.log.f64(double %a)
108  %2 = call reassoc double @llvm.exp.f64(double %1)
109  ret double %2
110}
111
112define double @exp_strict_log_reassoc(double %a) {
113; CHECK-LABEL: @exp_strict_log_reassoc(
114; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.log.f64(double [[A:%.*]])
115; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.exp.f64(double [[TMP1]])
116; CHECK-NEXT:    ret double [[TMP2]]
117;
118  %1 = call reassoc double @llvm.log.f64(double %a)
119  %2 = call double @llvm.exp.f64(double %1)
120  ret double %2
121}
122
123define double @exp_log_exp_log(double %a) {
124; CHECK-LABEL: @exp_log_exp_log(
125; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.log.f64(double [[A:%.*]])
126; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.exp.f64(double [[TMP1]])
127; CHECK-NEXT:    [[TMP3:%.*]] = call double @llvm.log.f64(double [[TMP2]])
128; CHECK-NEXT:    [[TMP4:%.*]] = call double @llvm.exp.f64(double [[TMP3]])
129; CHECK-NEXT:    ret double [[TMP4]]
130;
131  %1 = call double @llvm.log.f64(double %a)
132  %2 = call double @llvm.exp.f64(double %1)
133  %3 = call double @llvm.log.f64(double %2)
134  %4 = call double @llvm.exp.f64(double %3)
135  ret double %4
136}
137
138define double @exp_log_exp_log_reassoc(double %a) {
139; CHECK-LABEL: @exp_log_exp_log_reassoc(
140; CHECK-NEXT:    ret double [[A:%.*]]
141;
142  %1 = call double @llvm.log.f64(double %a)
143  %2 = call reassoc double @llvm.exp.f64(double %1)
144  %3 = call double @llvm.log.f64(double %2)
145  %4 = call reassoc double @llvm.exp.f64(double %3)
146  ret double %4
147}
148
149define double @exp2_reassoc_log2_strict(double %a) {
150; CHECK-LABEL: @exp2_reassoc_log2_strict(
151; CHECK-NEXT:    ret double [[A:%.*]]
152;
153  %1 = call double @llvm.log2.f64(double %a)
154  %2 = call reassoc double @llvm.exp2.f64(double %1)
155  ret double %2
156}
157
158define double @exp2_strict_log2_reassoc(double %a) {
159; CHECK-LABEL: @exp2_strict_log2_reassoc(
160; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.log2.f64(double [[A:%.*]])
161; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.exp2.f64(double [[TMP1]])
162; CHECK-NEXT:    ret double [[TMP2]]
163;
164  %1 = call reassoc double @llvm.log2.f64(double %a)
165  %2 = call double @llvm.exp2.f64(double %1)
166  ret double %2
167}
168
169define double @exp2_log2_exp2_log2(double %a) {
170; CHECK-LABEL: @exp2_log2_exp2_log2(
171; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.log2.f64(double [[A:%.*]])
172; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.exp2.f64(double [[TMP1]])
173; CHECK-NEXT:    [[TMP3:%.*]] = call double @llvm.log2.f64(double [[TMP2]])
174; CHECK-NEXT:    [[TMP4:%.*]] = call double @llvm.exp2.f64(double [[TMP3]])
175; CHECK-NEXT:    ret double [[TMP4]]
176;
177  %1 = call double @llvm.log2.f64(double %a)
178  %2 = call double @llvm.exp2.f64(double %1)
179  %3 = call double @llvm.log2.f64(double %2)
180  %4 = call double @llvm.exp2.f64(double %3)
181  ret double %4
182}
183
184define double @exp2_log2_exp2_log2_reassoc(double %a) {
185; CHECK-LABEL: @exp2_log2_exp2_log2_reassoc(
186; CHECK-NEXT:    ret double [[A:%.*]]
187;
188  %1 = call double @llvm.log2.f64(double %a)
189  %2 = call reassoc double @llvm.exp2.f64(double %1)
190  %3 = call double @llvm.log2.f64(double %2)
191  %4 = call reassoc double @llvm.exp2.f64(double %3)
192  ret double %4
193}
194
195define double @log10_reassoc_exp10_strict(double %a) {
196; CHECK-LABEL: @log10_reassoc_exp10_strict(
197; CHECK-NEXT:    ret double [[A:%.*]]
198;
199  %1 = call double @llvm.exp10.f64(double %a)
200  %2 = call reassoc double @llvm.log10.f64(double %1)
201  ret double %2
202}
203
204define double @log10_strict_exp10_reassoc(double %a) {
205; CHECK-LABEL: @log10_strict_exp10_reassoc(
206; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.exp10.f64(double [[A:%.*]])
207; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.log10.f64(double [[TMP1]])
208; CHECK-NEXT:    ret double [[TMP2]]
209;
210  %1 = call reassoc double @llvm.exp10.f64(double %a)
211  %2 = call double @llvm.log10.f64(double %1)
212  ret double %2
213}
214
215define double @log10_exp10_log10_exp10(double %a) {
216; CHECK-LABEL: @log10_exp10_log10_exp10(
217; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.exp10.f64(double [[A:%.*]])
218; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.log10.f64(double [[TMP1]])
219; CHECK-NEXT:    [[TMP3:%.*]] = call double @llvm.exp10.f64(double [[TMP2]])
220; CHECK-NEXT:    [[TMP4:%.*]] = call double @llvm.log10.f64(double [[TMP3]])
221; CHECK-NEXT:    ret double [[TMP4]]
222;
223  %1 = call double @llvm.exp10.f64(double %a)
224  %2 = call double @llvm.log10.f64(double %1)
225  %3 = call double @llvm.exp10.f64(double %2)
226  %4 = call double @llvm.log10.f64(double %3)
227  ret double %4
228}
229
230define double @log10_exp10_log10_exp10_reassoc(double %a) {
231; CHECK-LABEL: @log10_exp10_log10_exp10_reassoc(
232; CHECK-NEXT:    ret double [[A:%.*]]
233;
234  %1 = call double @llvm.exp10.f64(double %a)
235  %2 = call reassoc double @llvm.log10.f64(double %1)
236  %3 = call double @llvm.exp10.f64(double %2)
237  %4 = call reassoc double @llvm.log10.f64(double %3)
238  ret double %4
239}
240
241define double @exp10_reassoc_log10_strict(double %a) {
242; CHECK-LABEL: @exp10_reassoc_log10_strict(
243; CHECK-NEXT:    ret double [[A:%.*]]
244;
245  %1 = call double @llvm.log10.f64(double %a)
246  %2 = call reassoc double @llvm.exp10.f64(double %1)
247  ret double %2
248}
249
250define double @exp10_strict_log10_reassoc(double %a) {
251; CHECK-LABEL: @exp10_strict_log10_reassoc(
252; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.log10.f64(double [[A:%.*]])
253; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.exp10.f64(double [[TMP1]])
254; CHECK-NEXT:    ret double [[TMP2]]
255;
256  %1 = call reassoc double @llvm.log10.f64(double %a)
257  %2 = call double @llvm.exp10.f64(double %1)
258  ret double %2
259}
260
261define double @exp10_log10_exp10_log10(double %a) {
262; CHECK-LABEL: @exp10_log10_exp10_log10(
263; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.log10.f64(double [[A:%.*]])
264; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.exp10.f64(double [[TMP1]])
265; CHECK-NEXT:    [[TMP3:%.*]] = call double @llvm.log10.f64(double [[TMP2]])
266; CHECK-NEXT:    [[TMP4:%.*]] = call double @llvm.exp10.f64(double [[TMP3]])
267; CHECK-NEXT:    ret double [[TMP4]]
268;
269  %1 = call double @llvm.log10.f64(double %a)
270  %2 = call double @llvm.exp10.f64(double %1)
271  %3 = call double @llvm.log10.f64(double %2)
272  %4 = call double @llvm.exp10.f64(double %3)
273  ret double %4
274}
275
276define double @exp10_log10_exp10_log10_reassoc(double %a) {
277; CHECK-LABEL: @exp10_log10_exp10_log10_reassoc(
278; CHECK-NEXT:    ret double [[A:%.*]]
279;
280  %1 = call double @llvm.log10.f64(double %a)
281  %2 = call reassoc double @llvm.exp10.f64(double %1)
282  %3 = call double @llvm.log10.f64(double %2)
283  %4 = call reassoc double @llvm.exp10.f64(double %3)
284  ret double %4
285}
286
287define double @log2_reassoc_exp10_reassoc(double %a) {
288; CHECK-LABEL: @log2_reassoc_exp10_reassoc(
289; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.exp10.f64(double [[A:%.*]])
290; CHECK-NEXT:    [[TMP2:%.*]] = call reassoc double @llvm.log2.f64(double [[TMP1]])
291; CHECK-NEXT:    ret double [[TMP2]]
292;
293  %1 = call reassoc double @llvm.exp10.f64(double %a)
294  %2 = call reassoc double @llvm.log2.f64(double %1)
295  ret double %2
296}
297
298define double @log10_reassoc_exp2_reassoc(double %a) {
299; CHECK-LABEL: @log10_reassoc_exp2_reassoc(
300; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.exp2.f64(double [[A:%.*]])
301; CHECK-NEXT:    [[TMP2:%.*]] = call reassoc double @llvm.log10.f64(double [[TMP1]])
302; CHECK-NEXT:    ret double [[TMP2]]
303;
304  %1 = call reassoc double @llvm.exp2.f64(double %a)
305  %2 = call reassoc double @llvm.log10.f64(double %1)
306  ret double %2
307}
308
309define double @log10_reassoc_exp_reassoc(double %a) {
310; CHECK-LABEL: @log10_reassoc_exp_reassoc(
311; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.exp.f64(double [[A:%.*]])
312; CHECK-NEXT:    [[TMP2:%.*]] = call reassoc double @llvm.log10.f64(double [[TMP1]])
313; CHECK-NEXT:    ret double [[TMP2]]
314;
315  %1 = call reassoc double @llvm.exp.f64(double %a)
316  %2 = call reassoc double @llvm.log10.f64(double %1)
317  ret double %2
318}
319