@@ -88,7 +88,127 @@ define float @sqrt_call_fabs_f32(float %x) {
88
88
ret float %sqrt
89
89
}
90
90
91
+ define double @sqrt_exp (double %x ) {
92
+ ; CHECK-LABEL: @sqrt_exp(
93
+ ; CHECK-NEXT: [[MERGED_SQRT:%.*]] = fmul reassoc double [[X:%.*]], 5.000000e-01
94
+ ; CHECK-NEXT: [[E:%.*]] = call reassoc double @llvm.exp.f64(double [[MERGED_SQRT]])
95
+ ; CHECK-NEXT: ret double [[E]]
96
+ ;
97
+ %e = call reassoc double @llvm.exp.f64 (double %x )
98
+ %res = call reassoc double @llvm.sqrt.f64 (double %e )
99
+ ret double %res
100
+ }
101
+
102
+ define double @sqrt_exp_2 (double %x ) {
103
+ ; CHECK-LABEL: @sqrt_exp_2(
104
+ ; CHECK-NEXT: [[MERGED_SQRT:%.*]] = fmul reassoc double [[X:%.*]], 5.000000e-01
105
+ ; CHECK-NEXT: [[E:%.*]] = call reassoc double @exp(double [[MERGED_SQRT]])
106
+ ; CHECK-NEXT: ret double [[E]]
107
+ ;
108
+ %e = call reassoc double @exp (double %x )
109
+ %res = call reassoc double @sqrt (double %e )
110
+ ret double %res
111
+ }
112
+
113
+ define double @sqrt_exp2 (double %x ) {
114
+ ; CHECK-LABEL: @sqrt_exp2(
115
+ ; CHECK-NEXT: [[MERGED_SQRT:%.*]] = fmul reassoc double [[X:%.*]], 5.000000e-01
116
+ ; CHECK-NEXT: [[E:%.*]] = call reassoc double @exp2(double [[MERGED_SQRT]])
117
+ ; CHECK-NEXT: ret double [[E]]
118
+ ;
119
+ %e = call reassoc double @exp2 (double %x )
120
+ %res = call reassoc double @sqrt (double %e )
121
+ ret double %res
122
+ }
123
+
124
+ define double @sqrt_exp10 (double %x ) {
125
+ ; CHECK-LABEL: @sqrt_exp10(
126
+ ; CHECK-NEXT: [[MERGED_SQRT:%.*]] = fmul reassoc double [[X:%.*]], 5.000000e-01
127
+ ; CHECK-NEXT: [[E:%.*]] = call reassoc double @exp10(double [[MERGED_SQRT]])
128
+ ; CHECK-NEXT: ret double [[E]]
129
+ ;
130
+ %e = call reassoc double @exp10 (double %x )
131
+ %res = call reassoc double @sqrt (double %e )
132
+ ret double %res
133
+ }
134
+
135
+ ; Negative test
136
+ define double @sqrt_exp_nofast_1 (double %x ) {
137
+ ; CHECK-LABEL: @sqrt_exp_nofast_1(
138
+ ; CHECK-NEXT: [[E:%.*]] = call double @llvm.exp.f64(double [[X:%.*]])
139
+ ; CHECK-NEXT: [[RES:%.*]] = call reassoc double @llvm.sqrt.f64(double [[E]])
140
+ ; CHECK-NEXT: ret double [[RES]]
141
+ ;
142
+ %e = call double @llvm.exp.f64 (double %x )
143
+ %res = call reassoc double @llvm.sqrt.f64 (double %e )
144
+ ret double %res
145
+ }
146
+
147
+ ; Negative test
148
+ define double @sqrt_exp_nofast_2 (double %x ) {
149
+ ; CHECK-LABEL: @sqrt_exp_nofast_2(
150
+ ; CHECK-NEXT: [[E:%.*]] = call reassoc double @llvm.exp.f64(double [[X:%.*]])
151
+ ; CHECK-NEXT: [[RES:%.*]] = call double @llvm.sqrt.f64(double [[E]])
152
+ ; CHECK-NEXT: ret double [[RES]]
153
+ ;
154
+ %e = call reassoc double @llvm.exp.f64 (double %x )
155
+ %res = call double @llvm.sqrt.f64 (double %e )
156
+ ret double %res
157
+ }
158
+
159
+ define double @sqrt_exp_merge_constant (double %x , double %y ) {
160
+ ; CHECK-LABEL: @sqrt_exp_merge_constant(
161
+ ; CHECK-NEXT: [[MERGED_SQRT:%.*]] = fmul reassoc nsz double [[X:%.*]], 5.000000e+00
162
+ ; CHECK-NEXT: [[E:%.*]] = call reassoc double @llvm.exp.f64(double [[MERGED_SQRT]])
163
+ ; CHECK-NEXT: ret double [[E]]
164
+ ;
165
+ %mul = fmul reassoc nsz double %x , 10 .0
166
+ %e = call reassoc double @llvm.exp.f64 (double %mul )
167
+ %res = call reassoc nsz double @llvm.sqrt.f64 (double %e )
168
+ ret double %res
169
+ }
170
+
171
+ define double @sqrt_exp_intr_and_libcall (double %x ) {
172
+ ; CHECK-LABEL: @sqrt_exp_intr_and_libcall(
173
+ ; CHECK-NEXT: [[MERGED_SQRT:%.*]] = fmul reassoc double [[X:%.*]], 5.000000e-01
174
+ ; CHECK-NEXT: [[E:%.*]] = call reassoc double @exp(double [[MERGED_SQRT]])
175
+ ; CHECK-NEXT: ret double [[E]]
176
+ ;
177
+ %e = call reassoc double @exp (double %x )
178
+ %res = call reassoc double @llvm.sqrt.f64 (double %e )
179
+ ret double %res
180
+ }
181
+
182
+ define double @sqrt_exp_intr_and_libcall_2 (double %x ) {
183
+ ; CHECK-LABEL: @sqrt_exp_intr_and_libcall_2(
184
+ ; CHECK-NEXT: [[MERGED_SQRT:%.*]] = fmul reassoc double [[X:%.*]], 5.000000e-01
185
+ ; CHECK-NEXT: [[E:%.*]] = call reassoc double @llvm.exp.f64(double [[MERGED_SQRT]])
186
+ ; CHECK-NEXT: ret double [[E]]
187
+ ;
188
+ %e = call reassoc double @llvm.exp.f64 (double %x )
189
+ %res = call reassoc double @sqrt (double %e )
190
+ ret double %res
191
+ }
192
+
193
+ define <2 x float > @sqrt_exp_vec (<2 x float > %x ) {
194
+ ; CHECK-LABEL: @sqrt_exp_vec(
195
+ ; CHECK-NEXT: [[MERGED_SQRT:%.*]] = fmul reassoc <2 x float> [[X:%.*]], <float 5.000000e-01, float 5.000000e-01>
196
+ ; CHECK-NEXT: [[E:%.*]] = call reassoc <2 x float> @llvm.exp.v2f32(<2 x float> [[MERGED_SQRT]])
197
+ ; CHECK-NEXT: ret <2 x float> [[E]]
198
+ ;
199
+ %e = call reassoc <2 x float > @llvm.exp.v2f32 (<2 x float > %x )
200
+ %res = call reassoc <2 x float > @llvm.sqrt.v2f32 (<2 x float > %e )
201
+ ret <2 x float > %res
202
+ }
203
+
91
204
declare i32 @foo (double )
92
205
declare double @sqrt (double ) readnone
93
206
declare float @sqrtf (float )
94
207
declare float @llvm.fabs.f32 (float )
208
+ declare double @llvm.exp.f64 (double )
209
+ declare double @llvm.sqrt.f64 (double )
210
+ declare double @exp (double )
211
+ declare double @exp2 (double )
212
+ declare double @exp10 (double )
213
+ declare <2 x float > @llvm.exp.v2f32 (<2 x float >)
214
+ declare <2 x float > @llvm.sqrt.v2f32 (<2 x float >)
0 commit comments