blob: 89d167264031fbf0d7d4b3a777a1b15bc3d52463 [file] [log] [blame]
Sanjay Patelde3e8892018-02-12 23:18:11 +00001; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -instsimplify -S | FileCheck %s
3
4declare double @llvm.log.f64(double)
5declare double @llvm.exp.f64(double)
6
7define double @log_reassoc_exp_strict(double %a) {
8; CHECK-LABEL: @log_reassoc_exp_strict(
9; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.exp.f64(double [[A:%.*]])
10; CHECK-NEXT: [[TMP2:%.*]] = call reassoc double @llvm.log.f64(double [[TMP1]])
11; CHECK-NEXT: ret double [[TMP2]]
12;
13 %1 = call double @llvm.exp.f64(double %a)
14 %2 = call reassoc double @llvm.log.f64(double %1)
15 ret double %2
16}
17
18define double @log_strict_exp_reassoc(double %a) {
19; CHECK-LABEL: @log_strict_exp_reassoc(
20; CHECK-NEXT: [[TMP1:%.*]] = call reassoc double @llvm.exp.f64(double [[A:%.*]])
21; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.log.f64(double [[TMP1]])
22; CHECK-NEXT: ret double [[TMP2]]
23;
24 %1 = call reassoc double @llvm.exp.f64(double %a)
25 %2 = call double @llvm.log.f64(double %1)
26 ret double %2
27}
28
29define double @log_exp_log_exp(double %a) {
30; CHECK-LABEL: @log_exp_log_exp(
31; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.exp.f64(double [[A:%.*]])
32; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.log.f64(double [[TMP1]])
33; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.exp.f64(double [[TMP2]])
34; CHECK-NEXT: [[TMP4:%.*]] = call double @llvm.log.f64(double [[TMP3]])
35; CHECK-NEXT: ret double [[TMP4]]
36;
37 %1 = call double @llvm.exp.f64(double %a)
38 %2 = call double @llvm.log.f64(double %1)
39 %3 = call double @llvm.exp.f64(double %2)
40 %4 = call double @llvm.log.f64(double %3)
41 ret double %4
42}
43
44define double @log_exp_log_exp_reassoc(double %a) {
45; CHECK-LABEL: @log_exp_log_exp_reassoc(
46; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.exp.f64(double [[A:%.*]])
47; CHECK-NEXT: [[TMP2:%.*]] = call reassoc double @llvm.log.f64(double [[TMP1]])
48; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.exp.f64(double [[TMP2]])
49; CHECK-NEXT: [[TMP4:%.*]] = call reassoc double @llvm.log.f64(double [[TMP3]])
50; CHECK-NEXT: ret double [[TMP4]]
51;
52 %1 = call double @llvm.exp.f64(double %a)
53 %2 = call reassoc double @llvm.log.f64(double %1)
54 %3 = call double @llvm.exp.f64(double %2)
55 %4 = call reassoc double @llvm.log.f64(double %3)
56 ret double %4
57}
58
59declare double @llvm.log2.f64(double)
60declare double @llvm.exp2.f64(double)
61
62define double @log2_reassoc_exp2_strict(double %a) {
63; CHECK-LABEL: @log2_reassoc_exp2_strict(
64; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.exp2.f64(double [[A:%.*]])
65; CHECK-NEXT: [[TMP2:%.*]] = call reassoc double @llvm.log2.f64(double [[TMP1]])
66; CHECK-NEXT: ret double [[TMP2]]
67;
68 %1 = call double @llvm.exp2.f64(double %a)
69 %2 = call reassoc double @llvm.log2.f64(double %1)
70 ret double %2
71}
72
73define double @log2_strict_exp2_reassoc(double %a) {
74; CHECK-LABEL: @log2_strict_exp2_reassoc(
75; CHECK-NEXT: [[TMP1:%.*]] = call reassoc double @llvm.exp2.f64(double [[A:%.*]])
76; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.log2.f64(double [[TMP1]])
77; CHECK-NEXT: ret double [[TMP2]]
78;
79 %1 = call reassoc double @llvm.exp2.f64(double %a)
80 %2 = call double @llvm.log2.f64(double %1)
81 ret double %2
82}
83
84define double @log2_exp2_log2_exp2(double %a) {
85; CHECK-LABEL: @log2_exp2_log2_exp2(
86; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.exp2.f64(double [[A:%.*]])
87; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.log2.f64(double [[TMP1]])
88; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.exp2.f64(double [[TMP2]])
89; CHECK-NEXT: [[TMP4:%.*]] = call double @llvm.log2.f64(double [[TMP3]])
90; CHECK-NEXT: ret double [[TMP4]]
91;
92 %1 = call double @llvm.exp2.f64(double %a)
93 %2 = call double @llvm.log2.f64(double %1)
94 %3 = call double @llvm.exp2.f64(double %2)
95 %4 = call double @llvm.log2.f64(double %3)
96 ret double %4
97}
98
99define double @log2_exp2_log2_exp2_reassoc(double %a) {
100; CHECK-LABEL: @log2_exp2_log2_exp2_reassoc(
101; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.exp2.f64(double [[A:%.*]])
102; CHECK-NEXT: [[TMP2:%.*]] = call reassoc double @llvm.log2.f64(double [[TMP1]])
103; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.exp2.f64(double [[TMP2]])
104; CHECK-NEXT: [[TMP4:%.*]] = call reassoc double @llvm.log2.f64(double [[TMP3]])
105; CHECK-NEXT: ret double [[TMP4]]
106;
107 %1 = call double @llvm.exp2.f64(double %a)
108 %2 = call reassoc double @llvm.log2.f64(double %1)
109 %3 = call double @llvm.exp2.f64(double %2)
110 %4 = call reassoc double @llvm.log2.f64(double %3)
111 ret double %4
112}
113
114define double @exp_reassoc_log_strict(double %a) {
115; CHECK-LABEL: @exp_reassoc_log_strict(
116; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.log.f64(double [[A:%.*]])
117; CHECK-NEXT: [[TMP2:%.*]] = call reassoc double @llvm.exp.f64(double [[TMP1]])
118; CHECK-NEXT: ret double [[TMP2]]
119;
120 %1 = call double @llvm.log.f64(double %a)
121 %2 = call reassoc double @llvm.exp.f64(double %1)
122 ret double %2
123}
124
125define double @exp_strict_log_reassoc(double %a) {
126; CHECK-LABEL: @exp_strict_log_reassoc(
127; CHECK-NEXT: [[TMP1:%.*]] = call reassoc double @llvm.log.f64(double [[A:%.*]])
128; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.exp.f64(double [[TMP1]])
129; CHECK-NEXT: ret double [[TMP2]]
130;
131 %1 = call reassoc double @llvm.log.f64(double %a)
132 %2 = call double @llvm.exp.f64(double %1)
133 ret double %2
134}
135
136define double @exp_log_exp_log(double %a) {
137; CHECK-LABEL: @exp_log_exp_log(
138; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.log.f64(double [[A:%.*]])
139; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.exp.f64(double [[TMP1]])
140; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.log.f64(double [[TMP2]])
141; CHECK-NEXT: [[TMP4:%.*]] = call double @llvm.exp.f64(double [[TMP3]])
142; CHECK-NEXT: ret double [[TMP4]]
143;
144 %1 = call double @llvm.log.f64(double %a)
145 %2 = call double @llvm.exp.f64(double %1)
146 %3 = call double @llvm.log.f64(double %2)
147 %4 = call double @llvm.exp.f64(double %3)
148 ret double %4
149}
150
151define double @exp_log_exp_log_reassoc(double %a) {
152; CHECK-LABEL: @exp_log_exp_log_reassoc(
153; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.log.f64(double [[A:%.*]])
154; CHECK-NEXT: [[TMP2:%.*]] = call reassoc double @llvm.exp.f64(double [[TMP1]])
155; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.log.f64(double [[TMP2]])
156; CHECK-NEXT: [[TMP4:%.*]] = call reassoc double @llvm.exp.f64(double [[TMP3]])
157; CHECK-NEXT: ret double [[TMP4]]
158;
159 %1 = call double @llvm.log.f64(double %a)
160 %2 = call reassoc double @llvm.exp.f64(double %1)
161 %3 = call double @llvm.log.f64(double %2)
162 %4 = call reassoc double @llvm.exp.f64(double %3)
163 ret double %4
164}
165
166define double @exp2_reassoc_log2_strict(double %a) {
167; CHECK-LABEL: @exp2_reassoc_log2_strict(
168; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.log2.f64(double [[A:%.*]])
169; CHECK-NEXT: [[TMP2:%.*]] = call reassoc double @llvm.exp2.f64(double [[TMP1]])
170; CHECK-NEXT: ret double [[TMP2]]
171;
172 %1 = call double @llvm.log2.f64(double %a)
173 %2 = call reassoc double @llvm.exp2.f64(double %1)
174 ret double %2
175}
176
177define double @exp2_strict_log2_reassoc(double %a) {
178; CHECK-LABEL: @exp2_strict_log2_reassoc(
179; CHECK-NEXT: [[TMP1:%.*]] = call reassoc double @llvm.log2.f64(double [[A:%.*]])
180; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.exp2.f64(double [[TMP1]])
181; CHECK-NEXT: ret double [[TMP2]]
182;
183 %1 = call reassoc double @llvm.log2.f64(double %a)
184 %2 = call double @llvm.exp2.f64(double %1)
185 ret double %2
186}
187
188define double @exp2_log2_exp2_log2(double %a) {
189; CHECK-LABEL: @exp2_log2_exp2_log2(
190; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.log2.f64(double [[A:%.*]])
191; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.exp2.f64(double [[TMP1]])
192; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.log2.f64(double [[TMP2]])
193; CHECK-NEXT: [[TMP4:%.*]] = call double @llvm.exp2.f64(double [[TMP3]])
194; CHECK-NEXT: ret double [[TMP4]]
195;
196 %1 = call double @llvm.log2.f64(double %a)
197 %2 = call double @llvm.exp2.f64(double %1)
198 %3 = call double @llvm.log2.f64(double %2)
199 %4 = call double @llvm.exp2.f64(double %3)
200 ret double %4
201}
202
203define double @exp2_log2_exp2_log2_reassoc(double %a) {
204; CHECK-LABEL: @exp2_log2_exp2_log2_reassoc(
205; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.log2.f64(double [[A:%.*]])
206; CHECK-NEXT: [[TMP2:%.*]] = call reassoc double @llvm.exp2.f64(double [[TMP1]])
207; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.log2.f64(double [[TMP2]])
208; CHECK-NEXT: [[TMP4:%.*]] = call reassoc double @llvm.exp2.f64(double [[TMP3]])
209; CHECK-NEXT: ret double [[TMP4]]
210;
211 %1 = call double @llvm.log2.f64(double %a)
212 %2 = call reassoc double @llvm.exp2.f64(double %1)
213 %3 = call double @llvm.log2.f64(double %2)
214 %4 = call reassoc double @llvm.exp2.f64(double %3)
215 ret double %4
216}
217