Skip to content

Commit d01e0c8

Browse files
[NFC] Precommit tests for D109954
1 parent c533b88 commit d01e0c8

File tree

1 file changed

+182
-0
lines changed
  • llvm/test/Transforms/InstCombine

1 file changed

+182
-0
lines changed

llvm/test/Transforms/InstCombine/powi.ll

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
; RUN: opt -instcombine -S < %s | FileCheck %s
33

44
declare double @llvm.powi.f64.i32(double, i32)
5+
declare double @llvm.powi.f64.i64(double, i64)
56
declare double @llvm.fabs.f64(double)
67
declare double @llvm.copysign.f64(double, double)
8+
declare void @use(double)
79

810
define double @powi_fneg_even_int(double %x) {
911
; CHECK-LABEL: @powi_fneg_even_int(
@@ -79,3 +81,183 @@ entry:
7981
%r = tail call double @llvm.powi.f64.i32(double %cs, i32 5)
8082
ret double %r
8183
}
84+
85+
define double @powi_fmul_arg0_no_reassoc(double %x, i32 %i) {
86+
; CHECK-LABEL: @powi_fmul_arg0_no_reassoc(
87+
; CHECK-NEXT: entry:
88+
; CHECK-NEXT: [[POW:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[I:%.*]])
89+
; CHECK-NEXT: [[MUL:%.*]] = fmul double [[POW]], [[X]]
90+
; CHECK-NEXT: ret double [[MUL]]
91+
;
92+
entry:
93+
%pow = tail call double @llvm.powi.f64.i32(double %x, i32 %i)
94+
%mul = fmul double %pow, %x
95+
ret double %mul
96+
}
97+
98+
99+
define double @powi_fmul_arg0(double %x, i32 %i) {
100+
; CHECK-LABEL: @powi_fmul_arg0(
101+
; CHECK-NEXT: entry:
102+
; CHECK-NEXT: [[POW:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[I:%.*]])
103+
; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[POW]], [[X]]
104+
; CHECK-NEXT: ret double [[MUL]]
105+
;
106+
entry:
107+
%pow = tail call double @llvm.powi.f64.i32(double %x, i32 %i)
108+
%mul = fmul reassoc double %pow, %x
109+
ret double %mul
110+
}
111+
112+
define double @powi_fmul_arg0_use(double %x, i32 %i) {
113+
; CHECK-LABEL: @powi_fmul_arg0_use(
114+
; CHECK-NEXT: entry:
115+
; CHECK-NEXT: [[POW:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[I:%.*]])
116+
; CHECK-NEXT: tail call void @use(double [[POW]])
117+
; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[POW]], [[X]]
118+
; CHECK-NEXT: ret double [[MUL]]
119+
;
120+
entry:
121+
%pow = tail call double @llvm.powi.f64.i32(double %x, i32 %i)
122+
tail call void @use(double %pow)
123+
%mul = fmul reassoc double %pow, %x
124+
ret double %mul
125+
}
126+
127+
define double @powi_fmul_powi_no_reassoc(double %x, i32 %y, i32 %z) {
128+
; CHECK-LABEL: @powi_fmul_powi_no_reassoc(
129+
; CHECK-NEXT: entry:
130+
; CHECK-NEXT: [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
131+
; CHECK-NEXT: [[P2:%.*]] = tail call double @llvm.powi.f64.i32(double [[X]], i32 [[Z:%.*]])
132+
; CHECK-NEXT: [[MUL:%.*]] = fmul double [[P2]], [[P1]]
133+
; CHECK-NEXT: ret double [[MUL]]
134+
;
135+
entry:
136+
%p1 = tail call double @llvm.powi.f64.i32(double %x, i32 %y)
137+
%p2 = tail call double @llvm.powi.f64.i32(double %x, i32 %z)
138+
%mul = fmul double %p2, %p1
139+
ret double %mul
140+
}
141+
142+
143+
define double @powi_fmul_powi(double %x, i32 %y, i32 %z) {
144+
; CHECK-LABEL: @powi_fmul_powi(
145+
; CHECK-NEXT: entry:
146+
; CHECK-NEXT: [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
147+
; CHECK-NEXT: [[P2:%.*]] = tail call double @llvm.powi.f64.i32(double [[X]], i32 [[Z:%.*]])
148+
; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[P2]], [[P1]]
149+
; CHECK-NEXT: ret double [[MUL]]
150+
;
151+
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)
154+
%mul = fmul reassoc double %p2, %p1
155+
ret double %mul
156+
}
157+
158+
define double @powi_fmul_powi_fast_on_fmul(double %x, i32 %y, i32 %z) {
159+
; CHECK-LABEL: @powi_fmul_powi_fast_on_fmul(
160+
; CHECK-NEXT: entry:
161+
; CHECK-NEXT: [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
162+
; CHECK-NEXT: [[P2:%.*]] = tail call double @llvm.powi.f64.i32(double [[X]], i32 [[Z:%.*]])
163+
; CHECK-NEXT: [[MUL:%.*]] = fmul fast double [[P2]], [[P1]]
164+
; CHECK-NEXT: ret double [[MUL]]
165+
;
166+
entry:
167+
%p1 = tail call double @llvm.powi.f64.i32(double %x, i32 %y)
168+
%p2 = tail call double @llvm.powi.f64.i32(double %x, i32 %z)
169+
%mul = fmul fast double %p2, %p1
170+
ret double %mul
171+
}
172+
173+
define double @powi_fmul_powi_fast_on_powi(double %x, i32 %y, i32 %z) {
174+
; CHECK-LABEL: @powi_fmul_powi_fast_on_powi(
175+
; CHECK-NEXT: entry:
176+
; CHECK-NEXT: [[P1:%.*]] = tail call fast double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
177+
; CHECK-NEXT: [[P2:%.*]] = tail call fast double @llvm.powi.f64.i32(double [[X]], i32 [[Z:%.*]])
178+
; CHECK-NEXT: [[MUL:%.*]] = fmul double [[P2]], [[P1]]
179+
; CHECK-NEXT: ret double [[MUL]]
180+
;
181+
entry:
182+
%p1 = tail call fast double @llvm.powi.f64.i32(double %x, i32 %y)
183+
%p2 = tail call fast double @llvm.powi.f64.i32(double %x, i32 %z)
184+
%mul = fmul double %p2, %p1
185+
ret double %mul
186+
}
187+
188+
define double @powi_fmul_powi_same_power(double %x, i32 %y, i32 %z) {
189+
; CHECK-LABEL: @powi_fmul_powi_same_power(
190+
; CHECK-NEXT: entry:
191+
; CHECK-NEXT: [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
192+
; CHECK-NEXT: [[P2:%.*]] = tail call double @llvm.powi.f64.i32(double [[X]], i32 [[Y]])
193+
; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[P2]], [[P1]]
194+
; CHECK-NEXT: ret double [[MUL]]
195+
;
196+
entry:
197+
%p1 = tail call double @llvm.powi.f64.i32(double %x, i32 %y)
198+
%p2 = tail call double @llvm.powi.f64.i32(double %x, i32 %y)
199+
%mul = fmul reassoc double %p2, %p1
200+
ret double %mul
201+
}
202+
203+
define double @powi_fmul_powi_use_first(double %x, i32 %y, i32 %z) {
204+
; CHECK-LABEL: @powi_fmul_powi_use_first(
205+
; CHECK-NEXT: entry:
206+
; CHECK-NEXT: [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
207+
; CHECK-NEXT: tail call void @use(double [[P1]])
208+
; CHECK-NEXT: [[P2:%.*]] = tail call double @llvm.powi.f64.i32(double [[X]], i32 [[Z:%.*]])
209+
; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[P2]], [[P1]]
210+
; CHECK-NEXT: ret double [[MUL]]
211+
;
212+
entry:
213+
%p1 = tail call double @llvm.powi.f64.i32(double %x, i32 %y)
214+
tail call void @use(double %p1)
215+
%p2 = tail call double @llvm.powi.f64.i32(double %x, i32 %z)
216+
%mul = fmul reassoc double %p2, %p1
217+
ret double %mul
218+
}
219+
220+
define double @powi_fmul_powi_use_second(double %x, i32 %y, i32 %z) {
221+
; CHECK-LABEL: @powi_fmul_powi_use_second(
222+
; CHECK-NEXT: entry:
223+
; CHECK-NEXT: [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Z:%.*]])
224+
; CHECK-NEXT: tail call void @use(double [[P1]])
225+
; CHECK-NEXT: [[P2:%.*]] = tail call double @llvm.powi.f64.i32(double [[X]], i32 [[Y:%.*]])
226+
; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[P2]], [[P1]]
227+
; CHECK-NEXT: ret double [[MUL]]
228+
;
229+
entry:
230+
%p1 = tail call double @llvm.powi.f64.i32(double %x, i32 %z)
231+
tail call void @use(double %p1)
232+
%p2 = tail call double @llvm.powi.f64.i32(double %x, i32 %y)
233+
%mul = fmul reassoc double %p2, %p1
234+
ret double %mul
235+
}
236+
237+
define double @powi_fmul_different_base(double %x, double %m, i32 %y, i32 %z) {
238+
; CHECK-LABEL: @powi_fmul_different_base(
239+
; CHECK-NEXT: entry:
240+
; CHECK-NEXT: [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
241+
; CHECK-NEXT: [[P2:%.*]] = tail call double @llvm.powi.f64.i32(double [[M:%.*]], i32 [[Z:%.*]])
242+
; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[P2]], [[P1]]
243+
; CHECK-NEXT: ret double [[MUL]]
244+
;
245+
entry:
246+
%p1 = tail call double @llvm.powi.f64.i32(double %x, i32 %y)
247+
%p2 = tail call double @llvm.powi.f64.i32(double %m, i32 %z)
248+
%mul = fmul reassoc double %p2, %p1
249+
ret double %mul
250+
}
251+
252+
define double @different_types_powi(double %x, i32 %y, i64 %z) {
253+
; CHECK-LABEL: @different_types_powi(
254+
; CHECK-NEXT: [[P1:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 [[Y:%.*]])
255+
; CHECK-NEXT: [[P2:%.*]] = tail call double @llvm.powi.f64.i64(double [[X]], i64 [[Z:%.*]])
256+
; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[P2]], [[P1]]
257+
; CHECK-NEXT: ret double [[MUL]]
258+
;
259+
%p1 = tail call double @llvm.powi.f64.i32(double %x, i32 %y)
260+
%p2 = tail call double @llvm.powi.f64.i64(double %x, i64 %z)
261+
%mul = fmul reassoc double %p2, %p1
262+
ret double %mul
263+
}

0 commit comments

Comments
 (0)