@@ -125,22 +125,55 @@ entry:
125125 ret double %mul
126126}
127127
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(
130131; 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:%.*]])
133134; CHECK-NEXT: [[MUL:%.*]] = fmul double [[P2]], [[P1]]
134135; CHECK-NEXT: ret double [[MUL]]
135136;
136137entry:
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 )
139140 %mul = fmul double %p2 , %p1
140141 ret double %mul
141142}
142143
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+ }
143159
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
144177define double @powi_fmul_powi (double %x , i32 %y , i32 %z ) {
145178; CHECK-LABEL: @powi_fmul_powi(
146179; CHECK-NEXT: entry:
@@ -149,8 +182,8 @@ define double @powi_fmul_powi(double %x, i32 %y, i32 %z) {
149182; CHECK-NEXT: ret double [[MUL]]
150183;
151184entry:
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 )
154187 %mul = fmul reassoc double %p2 , %p1
155188 ret double %mul
156189}
@@ -163,8 +196,8 @@ define double @powi_fmul_powi_fast_on_fmul(double %x, i32 %y, i32 %z) {
163196; CHECK-NEXT: ret double [[MUL]]
164197;
165198entry:
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 )
168201 %mul = fmul fast double %p2 , %p1
169202 ret double %mul
170203}
@@ -192,42 +225,57 @@ define double @powi_fmul_powi_same_power(double %x, i32 %y, i32 %z) {
192225; CHECK-NEXT: ret double [[MUL]]
193226;
194227entry:
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 )
197245 %mul = fmul reassoc double %p2 , %p1
198246 ret double %mul
199247}
200248
201249define double @powi_fmul_powi_use_first (double %x , i32 %y , i32 %z ) {
202250; CHECK-LABEL: @powi_fmul_powi_use_first(
203251; 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:%.*]])
205253; CHECK-NEXT: tail call void @use(double [[P1]])
206254; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[Y]], [[Z:%.*]]
207255; CHECK-NEXT: [[MUL:%.*]] = call reassoc double @llvm.powi.f64.i32(double [[X]], i32 [[TMP0]])
208256; CHECK-NEXT: ret double [[MUL]]
209257;
210258entry:
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 )
212260 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 )
214262 %mul = fmul reassoc double %p1 , %p2
215263 ret double %mul
216264}
217265
218266define double @powi_fmul_powi_use_second (double %x , i32 %y , i32 %z ) {
219267; CHECK-LABEL: @powi_fmul_powi_use_second(
220268; 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:%.*]])
222270; CHECK-NEXT: tail call void @use(double [[P1]])
223271; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[Y:%.*]], [[Z]]
224272; CHECK-NEXT: [[MUL:%.*]] = call reassoc double @llvm.powi.f64.i32(double [[X]], i32 [[TMP0]])
225273; CHECK-NEXT: ret double [[MUL]]
226274;
227275entry:
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 )
229277 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 )
231279 %mul = fmul reassoc double %p2 , %p1
232280 ret double %mul
233281}
@@ -333,11 +381,11 @@ define double @fdiv_pow_powi_negative(double %x) {
333381; Negative test: The 2nd powi argument is a variable
334382define double @fdiv_pow_powi_negative_variable (double %x , i32 %y ) {
335383; 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:%.*]])
337385; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc nnan double [[P1]], [[X]]
338386; CHECK-NEXT: ret double [[DIV]]
339387;
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 )
341389 %div = fdiv reassoc nnan double %p1 , %x
342390 ret double %div
343391}
@@ -348,7 +396,7 @@ define double @powi_fmul_powi_x(double noundef %x) {
348396; CHECK-NEXT: [[MUL:%.*]] = call reassoc double @llvm.powi.f64.i32(double [[X:%.*]], i32 4)
349397; CHECK-NEXT: ret double [[MUL]]
350398;
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 )
352400 %mul = fmul reassoc double %p1 , %x
353401 ret double %mul
354402}
0 commit comments