@@ -5,6 +5,8 @@ declare double @llvm.pow.f64(double, double)
5
5
declare float @llvm.pow.f32 (float , float )
6
6
declare <2 x double > @llvm.pow.v2f64 (<2 x double >, <2 x double >)
7
7
declare <2 x float > @llvm.pow.v2f32 (<2 x float >, <2 x float >)
8
+ declare <4 x float > @llvm.pow.v4f32 (<4 x float >, <4 x float >)
9
+ declare double @pow (double , double )
8
10
9
11
; pow(x, 3.0)
10
12
define double @test_simplify_3 (double %x ) {
@@ -117,3 +119,107 @@ define double @test_simplify_33(double %x) {
117
119
ret double %1
118
120
}
119
121
122
+ ; pow(x, 16.5) with double
123
+ define double @test_simplify_16_5 (double %x ) {
124
+ ; CHECK-LABEL: @test_simplify_16_5(
125
+ ; CHECK-NEXT: [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[X]])
126
+ ; CHECK-NEXT: [[SQUARE:%.*]] = fmul fast double [[X:%.*]], [[X]]
127
+ ; CHECK-NEXT: [[TMP1:%.*]] = fmul fast double [[SQUARE]], [[SQUARE]]
128
+ ; CHECK-NEXT: [[TMP2:%.*]] = fmul fast double [[TMP1]], [[TMP1]]
129
+ ; CHECK-NEXT: [[TMP3:%.*]] = fmul fast double [[TMP2]], [[TMP2]]
130
+ ; CHECK-NEXT: [[TMP4:%.*]] = fmul fast double [[TMP3]], [[SQRT]]
131
+ ; CHECK-NEXT: ret double [[TMP4]]
132
+ ;
133
+ %1 = call fast double @llvm.pow.f64 (double %x , double 1 .650000e+01 )
134
+ ret double %1
135
+ }
136
+
137
+ ; pow(x, -16.5) with double
138
+ define double @test_simplify_neg_16_5 (double %x ) {
139
+ ; CHECK-LABEL: @test_simplify_neg_16_5(
140
+ ; CHECK-NEXT: [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[X]])
141
+ ; CHECK-NEXT: [[SQUARE:%.*]] = fmul fast double [[X:%.*]], [[X]]
142
+ ; CHECK-NEXT: [[TMP1:%.*]] = fmul fast double [[SQUARE]], [[SQUARE]]
143
+ ; CHECK-NEXT: [[TMP2:%.*]] = fmul fast double [[TMP1]], [[TMP1]]
144
+ ; CHECK-NEXT: [[TMP3:%.*]] = fmul fast double [[TMP2]], [[TMP2]]
145
+ ; CHECK-NEXT: [[TMP4:%.*]] = fmul fast double [[TMP3]], [[SQRT]]
146
+ ; CHECK-NEXT: [[RECIPROCAL:%.*]] = fdiv fast double 1.000000e+00, [[TMP4]]
147
+ ; CHECK-NEXT: ret double [[RECIPROCAL]]
148
+ ;
149
+ %1 = call fast double @llvm.pow.f64 (double %x , double -1 .650000e+01 )
150
+ ret double %1
151
+ }
152
+
153
+ ; pow(x, 16.5) with double
154
+ define double @test_simplify_16_5_libcall (double %x ) {
155
+ ; CHECK-LABEL: @test_simplify_16_5_libcall(
156
+ ; CHECK-NEXT: [[SQRT:%.*]] = call fast double @sqrt(double [[X:%.*]])
157
+ ; CHECK-NEXT: [[SQUARE:%.*]] = fmul fast double [[X]], [[X]]
158
+ ; CHECK-NEXT: [[TMP1:%.*]] = fmul fast double [[SQUARE]], [[SQUARE]]
159
+ ; CHECK-NEXT: [[TMP2:%.*]] = fmul fast double [[TMP1]], [[TMP1]]
160
+ ; CHECK-NEXT: [[TMP3:%.*]] = fmul fast double [[TMP2]], [[TMP2]]
161
+ ; CHECK-NEXT: [[TMP4:%.*]] = fmul fast double [[TMP3]], [[SQRT]]
162
+ ; CHECK-NEXT: ret double [[TMP4]]
163
+ ;
164
+ %1 = call fast double @pow (double %x , double 1 .650000e+01 )
165
+ ret double %1
166
+ }
167
+
168
+ ; pow(x, -16.5) with double
169
+ define double @test_simplify_neg_16_5_libcall (double %x ) {
170
+ ; CHECK-LABEL: @test_simplify_neg_16_5_libcall(
171
+ ; CHECK-NEXT: [[SQRT:%.*]] = call fast double @sqrt(double [[X:%.*]])
172
+ ; CHECK-NEXT: [[SQUARE:%.*]] = fmul fast double [[X]], [[X]]
173
+ ; CHECK-NEXT: [[TMP1:%.*]] = fmul fast double [[SQUARE]], [[SQUARE]]
174
+ ; CHECK-NEXT: [[TMP2:%.*]] = fmul fast double [[TMP1]], [[TMP1]]
175
+ ; CHECK-NEXT: [[TMP3:%.*]] = fmul fast double [[TMP2]], [[TMP2]]
176
+ ; CHECK-NEXT: [[TMP4:%.*]] = fmul fast double [[TMP3]], [[SQRT]]
177
+ ; CHECK-NEXT: [[RECIPROCAL:%.*]] = fdiv fast double 1.000000e+00, [[TMP4]]
178
+ ; CHECK-NEXT: ret double [[RECIPROCAL]]
179
+ ;
180
+ %1 = call fast double @pow (double %x , double -1 .650000e+01 )
181
+ ret double %1
182
+ }
183
+
184
+ ; pow(x, -8.5) with float
185
+ define float @test_simplify_neg_8_5 (float %x ) {
186
+ ; CHECK-LABEL: @test_simplify_neg_8_5(
187
+ ; CHECK-NEXT: [[SQRT:%.*]] = call fast float @llvm.sqrt.f32(float [[X:%.*]])
188
+ ; CHECK-NEXT: [[SQUARE:%.*]] = fmul fast float [[X]], [[X]]
189
+ ; CHECK-NEXT: [[TMP1:%.*]] = fmul fast float [[SQUARE]], [[SQUARE]]
190
+ ; CHECK-NEXT: [[TMP2:%.*]] = fmul fast float [[TMP1]], [[SQRT]]
191
+ ; CHECK-NEXT: [[RECIPROCAL:%.*]] = fdiv fast float 1.000000e+00, [[TMP2]]
192
+ ; CHECK-NEXT: ret float [[RECIPROCAL]]
193
+ ;
194
+ %1 = call fast float @llvm.pow.f32 (float %x , float -0 .450000e+01 )
195
+ ret float %1
196
+ }
197
+
198
+ ; pow(x, 7.5) with <2 x double>
199
+ define <2 x double > @test_simplify_7_5 (<2 x double > %x ) {
200
+ ; CHECK-LABEL: @test_simplify_7_5(
201
+ ; CHECK-NEXT: [[SQRT:%.*]] = call fast <2 x double> @llvm.sqrt.v2f64(<2 x double> [[X:%.*]])
202
+ ; CHECK-NEXT: [[SQUARE:%.*]] = fmul fast <2 x double> [[X]], [[X]]
203
+ ; CHECK-NEXT: [[TMP1:%.*]] = fmul fast <2 x double> [[SQUARE]], [[SQUARE]]
204
+ ; CHECK-NEXT: [[TMP2:%.*]] = fmul fast <2 x double> [[TMP1]], [[X]]
205
+ ; CHECK-NEXT: [[TMP3:%.*]] = fmul fast <2 x double> [[SQUARE]], [[TMP2]]
206
+ ; CHECK-NEXT: [[TMP4:%.*]] = fmul fast <2 x double> [[TMP3]], [[SQRT]]
207
+ ; CHECK-NEXT: ret <2 x double> [[TMP4]]
208
+ ;
209
+ %1 = call fast <2 x double > @llvm.pow.v2f64 (<2 x double > %x , <2 x double > <double 7 .500000e+00 , double 7 .500000e+00 >)
210
+ ret <2 x double > %1
211
+ }
212
+
213
+ ; pow(x, 3.5) with <4 x float>
214
+ define <4 x float > @test_simplify_3_5 (<4 x float > %x ) {
215
+ ; CHECK-LABEL: @test_simplify_3_5(
216
+ ; CHECK-NEXT: [[SQRT:%.*]] = call fast <4 x float> @llvm.sqrt.v4f32(<4 x float> [[X:%.*]])
217
+ ; CHECK-NEXT: [[TMP1:%.*]] = fmul fast <4 x float> [[X]], [[X]]
218
+ ; CHECK-NEXT: [[TMP2:%.*]] = fmul fast <4 x float> [[TMP1]], [[X]]
219
+ ; CHECK-NEXT: [[TMP3:%.*]] = fmul fast <4 x float> [[TMP2]], [[SQRT]]
220
+ ; CHECK-NEXT: ret <4 x float> [[TMP3]]
221
+ ;
222
+ %1 = call fast <4 x float > @llvm.pow.v4f32 (<4 x float > %x , <4 x float > <float 3 .500000e+00 , float 3 .500000e+00 , float 3 .500000e+00 , float 3 .500000e+00 >)
223
+ ret <4 x float > %1
224
+ }
225
+
0 commit comments