@@ -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
+ }
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
+ }
143
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,42 @@ 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 )
197
230
%mul = fmul reassoc double %p2 , %p1
198
231
ret double %mul
199
232
}
200
233
201
234
define double @powi_fmul_powi_use_first (double %x , i32 %y , i32 %z ) {
202
235
; CHECK-LABEL: @powi_fmul_powi_use_first(
203
236
; CHECK-NEXT: entry:
204
- ; CHECK-NEXT: [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
237
+ ; CHECK-NEXT: [[P1:%.*]] = tail call reassoc double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
205
238
; CHECK-NEXT: tail call void @use(double [[P1]])
206
239
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[Y]], [[Z:%.*]]
207
240
; CHECK-NEXT: [[MUL:%.*]] = call reassoc double @llvm.powi.f64.i32(double [[X]], i32 [[TMP0]])
208
241
; CHECK-NEXT: ret double [[MUL]]
209
242
;
210
243
entry:
211
- %p1 = tail call double @llvm.powi.f64.i32 (double %x , i32 %y )
244
+ %p1 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 %y )
212
245
tail call void @use (double %p1 )
213
- %p2 = tail call double @llvm.powi.f64.i32 (double %x , i32 %z )
246
+ %p2 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 %z )
214
247
%mul = fmul reassoc double %p1 , %p2
215
248
ret double %mul
216
249
}
217
250
218
251
define double @powi_fmul_powi_use_second (double %x , i32 %y , i32 %z ) {
219
252
; CHECK-LABEL: @powi_fmul_powi_use_second(
220
253
; CHECK-NEXT: entry:
221
- ; CHECK-NEXT: [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Z:%.*]])
254
+ ; CHECK-NEXT: [[P1:%.*]] = tail call reassoc double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Z:%.*]])
222
255
; CHECK-NEXT: tail call void @use(double [[P1]])
223
256
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[Y:%.*]], [[Z]]
224
257
; CHECK-NEXT: [[MUL:%.*]] = call reassoc double @llvm.powi.f64.i32(double [[X]], i32 [[TMP0]])
225
258
; CHECK-NEXT: ret double [[MUL]]
226
259
;
227
260
entry:
228
- %p1 = tail call double @llvm.powi.f64.i32 (double %x , i32 %z )
261
+ %p1 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 %z )
229
262
tail call void @use (double %p1 )
230
- %p2 = tail call double @llvm.powi.f64.i32 (double %x , i32 %y )
263
+ %p2 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 %y )
231
264
%mul = fmul reassoc double %p2 , %p1
232
265
ret double %mul
233
266
}
@@ -333,11 +366,11 @@ define double @fdiv_pow_powi_negative(double %x) {
333
366
; Negative test: The 2nd powi argument is a variable
334
367
define double @fdiv_pow_powi_negative_variable (double %x , i32 %y ) {
335
368
; CHECK-LABEL: @fdiv_pow_powi_negative_variable(
336
- ; CHECK-NEXT: [[P1:%.*]] = call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
369
+ ; CHECK-NEXT: [[P1:%.*]] = call reassoc double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
337
370
; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc nnan double [[P1]], [[X]]
338
371
; CHECK-NEXT: ret double [[DIV]]
339
372
;
340
- %p1 = call double @llvm.powi.f64.i32 (double %x , i32 %y )
373
+ %p1 = call reassoc double @llvm.powi.f64.i32 (double %x , i32 %y )
341
374
%div = fdiv reassoc nnan double %p1 , %x
342
375
ret double %div
343
376
}
@@ -348,7 +381,7 @@ define double @powi_fmul_powi_x(double noundef %x) {
348
381
; CHECK-NEXT: [[MUL:%.*]] = call reassoc double @llvm.powi.f64.i32(double [[X:%.*]], i32 4)
349
382
; CHECK-NEXT: ret double [[MUL]]
350
383
;
351
- %p1 = tail call double @llvm.powi.f64.i32 (double %x , i32 3 )
384
+ %p1 = tail call reassoc double @llvm.powi.f64.i32 (double %x , i32 3 )
352
385
%mul = fmul reassoc double %p1 , %x
353
386
ret double %mul
354
387
}
0 commit comments