@@ -125,22 +125,55 @@ entry:
125
125
ret double %mul
126
126
}
127
127
128
- define double @powi_fmul_powi_no_reassoc (double %x , i32 %y , i32 %z ) {
129
- ; CHECK-LABEL: @powi_fmul_powi_no_reassoc(
128
+ ; Negative test: Missing reassoc flag on fmul
129
+ define double @powi_fmul_powi_no_reassoc1 (double %x , i32 %y , i32 %z ) {
130
+ ; CHECK-LABEL: @powi_fmul_powi_no_reassoc1(
130
131
; CHECK-NEXT: entry:
131
- ; CHECK-NEXT: [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
132
- ; CHECK-NEXT: [[P2:%.*]] = tail call double @llvm.powi.f64.i32(double [[X]], i32 [[Z:%.*]])
132
+ ; CHECK-NEXT: [[P1:%.*]] = tail call reassoc double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
133
+ ; CHECK-NEXT: [[P2:%.*]] = tail call reassoc double @llvm.powi.f64.i32(double [[X]], i32 [[Z:%.*]])
133
134
; CHECK-NEXT: [[MUL:%.*]] = fmul double [[P2]], [[P1]]
134
135
; CHECK-NEXT: ret double [[MUL]]
135
136
;
136
137
entry:
137
- %p1 = tail call double @llvm.powi.f64.i32 (double %x , i32 %y )
138
- %p2 = tail call double @llvm.powi.f64.i32 (double %x , i32 %z )
138
+ %p1 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 %y )
139
+ %p2 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 %z )
139
140
%mul = fmul double %p2 , %p1
140
141
ret double %mul
141
142
}
142
143
144
+ ; Negative test: Missing reassoc flag on 2nd operand
145
+ define double @powi_fmul_powi_no_reassoc2 (double %x , i32 %y , i32 %z ) {
146
+ ; CHECK-LABEL: @powi_fmul_powi_no_reassoc2(
147
+ ; CHECK-NEXT: entry:
148
+ ; CHECK-NEXT: [[P1:%.*]] = tail call reassoc double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
149
+ ; CHECK-NEXT: [[P2:%.*]] = tail call double @llvm.powi.f64.i32(double [[X]], i32 [[Z:%.*]])
150
+ ; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[P2]], [[P1]]
151
+ ; CHECK-NEXT: ret double [[MUL]]
152
+ ;
153
+ entry:
154
+ %p1 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 %y )
155
+ %p2 = tail call double @llvm.powi.f64.i32 (double %x , i32 %z )
156
+ %mul = fmul reassoc double %p2 , %p1
157
+ ret double %mul
158
+ }
143
159
160
+ ; Negative test: Missing reassoc flag on 1st operand
161
+ define double @powi_fmul_powi_no_reassoc3 (double %x , i32 %y , i32 %z ) {
162
+ ; CHECK-LABEL: @powi_fmul_powi_no_reassoc3(
163
+ ; CHECK-NEXT: entry:
164
+ ; CHECK-NEXT: [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
165
+ ; CHECK-NEXT: [[P2:%.*]] = tail call reassoc double @llvm.powi.f64.i32(double [[X]], i32 [[Z:%.*]])
166
+ ; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[P2]], [[P1]]
167
+ ; CHECK-NEXT: ret double [[MUL]]
168
+ ;
169
+ entry:
170
+ %p1 = tail call double @llvm.powi.f64.i32 (double %x , i32 %y )
171
+ %p2 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 %z )
172
+ %mul = fmul reassoc double %p2 , %p1
173
+ ret double %mul
174
+ }
175
+
176
+ ; All of the fmul and its operands should have the reassoc flags
144
177
define double @powi_fmul_powi (double %x , i32 %y , i32 %z ) {
145
178
; CHECK-LABEL: @powi_fmul_powi(
146
179
; CHECK-NEXT: entry:
@@ -149,8 +182,8 @@ define double @powi_fmul_powi(double %x, i32 %y, i32 %z) {
149
182
; CHECK-NEXT: ret double [[MUL]]
150
183
;
151
184
entry:
152
- %p1 = tail call double @llvm.powi.f64.i32 (double %x , i32 %y )
153
- %p2 = tail call double @llvm.powi.f64.i32 (double %x , i32 %z )
185
+ %p1 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 %y )
186
+ %p2 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 %z )
154
187
%mul = fmul reassoc double %p2 , %p1
155
188
ret double %mul
156
189
}
@@ -163,8 +196,8 @@ define double @powi_fmul_powi_fast_on_fmul(double %x, i32 %y, i32 %z) {
163
196
; CHECK-NEXT: ret double [[MUL]]
164
197
;
165
198
entry:
166
- %p1 = tail call double @llvm.powi.f64.i32 (double %x , i32 %y )
167
- %p2 = tail call double @llvm.powi.f64.i32 (double %x , i32 %z )
199
+ %p1 = tail call fast double @llvm.powi.f64.i32 (double %x , i32 %y )
200
+ %p2 = tail call fast double @llvm.powi.f64.i32 (double %x , i32 %z )
168
201
%mul = fmul fast double %p2 , %p1
169
202
ret double %mul
170
203
}
@@ -192,42 +225,57 @@ define double @powi_fmul_powi_same_power(double %x, i32 %y, i32 %z) {
192
225
; CHECK-NEXT: ret double [[MUL]]
193
226
;
194
227
entry:
195
- %p1 = tail call double @llvm.powi.f64.i32 (double %x , i32 %y )
196
- %p2 = tail call double @llvm.powi.f64.i32 (double %x , i32 %y )
228
+ %p1 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 %y )
229
+ %p2 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 %y )
230
+ %mul = fmul reassoc double %p2 , %p1
231
+ ret double %mul
232
+ }
233
+
234
+ define double @powi_fmul_powi_different_integer_types (double %x , i32 %y , i16 %z ) {
235
+ ; CHECK-LABEL: @powi_fmul_powi_different_integer_types(
236
+ ; CHECK-NEXT: entry:
237
+ ; CHECK-NEXT: [[P1:%.*]] = tail call reassoc double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
238
+ ; CHECK-NEXT: [[P2:%.*]] = tail call reassoc double @llvm.powi.f64.i16(double [[X]], i16 [[Z:%.*]])
239
+ ; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[P2]], [[P1]]
240
+ ; CHECK-NEXT: ret double [[MUL]]
241
+ ;
242
+ entry:
243
+ %p1 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 %y )
244
+ %p2 = tail call reassoc double @llvm.powi.f64.i16 (double %x , i16 %z )
197
245
%mul = fmul reassoc double %p2 , %p1
198
246
ret double %mul
199
247
}
200
248
201
249
define double @powi_fmul_powi_use_first (double %x , i32 %y , i32 %z ) {
202
250
; CHECK-LABEL: @powi_fmul_powi_use_first(
203
251
; CHECK-NEXT: entry:
204
- ; CHECK-NEXT: [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
252
+ ; CHECK-NEXT: [[P1:%.*]] = tail call reassoc double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
205
253
; CHECK-NEXT: tail call void @use(double [[P1]])
206
254
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[Y]], [[Z:%.*]]
207
255
; CHECK-NEXT: [[MUL:%.*]] = call reassoc double @llvm.powi.f64.i32(double [[X]], i32 [[TMP0]])
208
256
; CHECK-NEXT: ret double [[MUL]]
209
257
;
210
258
entry:
211
- %p1 = tail call double @llvm.powi.f64.i32 (double %x , i32 %y )
259
+ %p1 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 %y )
212
260
tail call void @use (double %p1 )
213
- %p2 = tail call double @llvm.powi.f64.i32 (double %x , i32 %z )
261
+ %p2 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 %z )
214
262
%mul = fmul reassoc double %p1 , %p2
215
263
ret double %mul
216
264
}
217
265
218
266
define double @powi_fmul_powi_use_second (double %x , i32 %y , i32 %z ) {
219
267
; CHECK-LABEL: @powi_fmul_powi_use_second(
220
268
; CHECK-NEXT: entry:
221
- ; CHECK-NEXT: [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Z:%.*]])
269
+ ; CHECK-NEXT: [[P1:%.*]] = tail call reassoc double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Z:%.*]])
222
270
; CHECK-NEXT: tail call void @use(double [[P1]])
223
271
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[Y:%.*]], [[Z]]
224
272
; CHECK-NEXT: [[MUL:%.*]] = call reassoc double @llvm.powi.f64.i32(double [[X]], i32 [[TMP0]])
225
273
; CHECK-NEXT: ret double [[MUL]]
226
274
;
227
275
entry:
228
- %p1 = tail call double @llvm.powi.f64.i32 (double %x , i32 %z )
276
+ %p1 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 %z )
229
277
tail call void @use (double %p1 )
230
- %p2 = tail call double @llvm.powi.f64.i32 (double %x , i32 %y )
278
+ %p2 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 %y )
231
279
%mul = fmul reassoc double %p2 , %p1
232
280
ret double %mul
233
281
}
@@ -333,11 +381,11 @@ define double @fdiv_pow_powi_negative(double %x) {
333
381
; Negative test: The 2nd powi argument is a variable
334
382
define double @fdiv_pow_powi_negative_variable (double %x , i32 %y ) {
335
383
; CHECK-LABEL: @fdiv_pow_powi_negative_variable(
336
- ; CHECK-NEXT: [[P1:%.*]] = call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
384
+ ; CHECK-NEXT: [[P1:%.*]] = call reassoc double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
337
385
; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc nnan double [[P1]], [[X]]
338
386
; CHECK-NEXT: ret double [[DIV]]
339
387
;
340
- %p1 = call double @llvm.powi.f64.i32 (double %x , i32 %y )
388
+ %p1 = call reassoc double @llvm.powi.f64.i32 (double %x , i32 %y )
341
389
%div = fdiv reassoc nnan double %p1 , %x
342
390
ret double %div
343
391
}
@@ -348,7 +396,7 @@ define double @powi_fmul_powi_x(double noundef %x) {
348
396
; CHECK-NEXT: [[MUL:%.*]] = call reassoc double @llvm.powi.f64.i32(double [[X:%.*]], i32 4)
349
397
; CHECK-NEXT: ret double [[MUL]]
350
398
;
351
- %p1 = tail call double @llvm.powi.f64.i32 (double %x , i32 3 )
399
+ %p1 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 3 )
352
400
%mul = fmul reassoc double %p1 , %x
353
401
ret double %mul
354
402
}
0 commit comments