xref: /llvm-project/llvm/test/Transforms/InstCombine/freeze-integer-intrinsics.ll (revision b8f3024a315074e0f880542c33cb89681eebc5a3)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3
4define i32 @ctlz_true_freeze(i32 %arg) {
5; CHECK-LABEL: @ctlz_true_freeze(
6; CHECK-NEXT:    [[CALL:%.*]] = call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[ARG:%.*]], i1 true)
7; CHECK-NEXT:    [[FREEZE:%.*]] = freeze i32 [[CALL]]
8; CHECK-NEXT:    ret i32 [[FREEZE]]
9;
10  %call = call i32 @llvm.ctlz.i32(i32 %arg, i1 true)
11  %freeze = freeze i32 %call
12  ret i32 %freeze
13}
14
15define i32 @ctlz_false_freeze(i32 %arg) {
16; CHECK-LABEL: @ctlz_false_freeze(
17; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze i32 [[ARG:%.*]]
18; CHECK-NEXT:    [[CALL:%.*]] = call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[ARG_FR]], i1 false)
19; CHECK-NEXT:    ret i32 [[CALL]]
20;
21  %call = call i32 @llvm.ctlz.i32(i32 %arg, i1 false)
22  %freeze = freeze i32 %call
23  ret i32 %freeze
24}
25
26define i32 @ctlz_true_noundef_freeze(i32 %arg) {
27; CHECK-LABEL: @ctlz_true_noundef_freeze(
28; CHECK-NEXT:    [[CALL:%.*]] = call noundef range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[ARG:%.*]], i1 true)
29; CHECK-NEXT:    ret i32 [[CALL]]
30;
31  %call = call noundef i32 @llvm.ctlz.i32(i32 %arg, i1 true)
32  %freeze = freeze i32 %call
33  ret i32 %freeze
34}
35
36define i32 @cttz_true_freeze(i32 %arg) {
37; CHECK-LABEL: @cttz_true_freeze(
38; CHECK-NEXT:    [[CALL:%.*]] = call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[ARG:%.*]], i1 true)
39; CHECK-NEXT:    [[FREEZE:%.*]] = freeze i32 [[CALL]]
40; CHECK-NEXT:    ret i32 [[FREEZE]]
41;
42  %call = call i32 @llvm.cttz.i32(i32 %arg, i1 true)
43  %freeze = freeze i32 %call
44  ret i32 %freeze
45}
46
47define i32 @cttz_true_noundef_freeze(i32 %arg) {
48; CHECK-LABEL: @cttz_true_noundef_freeze(
49; CHECK-NEXT:    [[CALL:%.*]] = call noundef range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[ARG:%.*]], i1 true)
50; CHECK-NEXT:    ret i32 [[CALL]]
51;
52  %call = call noundef i32 @llvm.cttz.i32(i32 %arg, i1 true)
53  %freeze = freeze i32 %call
54  ret i32 %freeze
55}
56
57define i32 @freeze_cttz_true(i32 %arg) {
58; CHECK-LABEL: @freeze_cttz_true(
59; CHECK-NEXT:    [[FREEZE:%.*]] = freeze i32 [[ARG:%.*]]
60; CHECK-NEXT:    [[CALL:%.*]] = call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[FREEZE]], i1 true)
61; CHECK-NEXT:    ret i32 [[CALL]]
62;
63  %freeze = freeze i32 %arg
64  %call = call i32 @llvm.cttz.i32(i32 %freeze, i1 true)
65  ret i32 %call
66}
67
68define i32 @cttz_false_freeze(i32 %arg) {
69; CHECK-LABEL: @cttz_false_freeze(
70; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze i32 [[ARG:%.*]]
71; CHECK-NEXT:    [[CALL:%.*]] = call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[ARG_FR]], i1 false)
72; CHECK-NEXT:    ret i32 [[CALL]]
73;
74  %call = call i32 @llvm.cttz.i32(i32 %arg, i1 false)
75  %freeze = freeze i32 %call
76  ret i32 %freeze
77}
78
79define i32 @freeze_cttz_false(i32 %arg) {
80; CHECK-LABEL: @freeze_cttz_false(
81; CHECK-NEXT:    [[FREEZE:%.*]] = freeze i32 [[ARG:%.*]]
82; CHECK-NEXT:    [[CALL:%.*]] = call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[FREEZE]], i1 false)
83; CHECK-NEXT:    ret i32 [[CALL]]
84;
85  %freeze = freeze i32 %arg
86  %call = call i32 @llvm.cttz.i32(i32 %freeze, i1 false)
87  ret i32 %call
88}
89
90define i32 @abs_true_i32(i32 %arg) {
91; CHECK-LABEL: @abs_true_i32(
92; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.abs.i32(i32 [[ARG:%.*]], i1 true)
93; CHECK-NEXT:    [[FREEZE:%.*]] = freeze i32 [[CALL]]
94; CHECK-NEXT:    ret i32 [[FREEZE]]
95;
96  %call = call i32 @llvm.abs.i32(i32 %arg, i1 true)
97  %freeze = freeze i32 %call
98  ret i32 %freeze
99}
100
101define i32 @abs_false_i32(i32 %arg) {
102; CHECK-LABEL: @abs_false_i32(
103; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze i32 [[ARG:%.*]]
104; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.abs.i32(i32 [[ARG_FR]], i1 false)
105; CHECK-NEXT:    ret i32 [[CALL]]
106;
107  %call = call i32 @llvm.abs.i32(i32 %arg, i1 false)
108  %freeze = freeze i32 %call
109  ret i32 %freeze
110}
111
112define i32 @noundef_abs_true_i32(i32 %arg) {
113; CHECK-LABEL: @noundef_abs_true_i32(
114; CHECK-NEXT:    [[CALL:%.*]] = call noundef i32 @llvm.abs.i32(i32 [[ARG:%.*]], i1 true)
115; CHECK-NEXT:    ret i32 [[CALL]]
116;
117  %call = call noundef i32 @llvm.abs.i32(i32 %arg, i1 true)
118  %freeze = freeze i32 %call
119  ret i32 %freeze
120}
121
122define i32 @bswap_i32(i32 %arg) {
123; CHECK-LABEL: @bswap_i32(
124; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze i32 [[ARG:%.*]]
125; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.bswap.i32(i32 [[ARG_FR]])
126; CHECK-NEXT:    ret i32 [[CALL]]
127;
128  %call = call i32 @llvm.bswap.i32(i32 %arg)
129  %freeze = freeze i32 %call
130  ret i32 %freeze
131}
132
133define i32 @bitreverse_i32(i32 %arg) {
134; CHECK-LABEL: @bitreverse_i32(
135; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze i32 [[ARG:%.*]]
136; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[ARG_FR]])
137; CHECK-NEXT:    ret i32 [[CALL]]
138;
139  %call = call i32 @llvm.bitreverse.i32(i32 %arg)
140  %freeze = freeze i32 %call
141  ret i32 %freeze
142}
143
144define i32 @fshl_i32(i32 %arg0, i32 noundef %arg1, i32 noundef %arg2) {
145; CHECK-LABEL: @fshl_i32(
146; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
147; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.fshl.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]], i32 [[ARG2:%.*]])
148; CHECK-NEXT:    ret i32 [[CALL]]
149;
150  %call = call i32 @llvm.fshl.i32(i32 %arg0, i32 %arg1, i32 %arg2)
151  %freeze = freeze i32 %call
152  ret i32 %freeze
153}
154
155define i32 @fshr_i32(i32 %arg0, i32 noundef %arg1, i32 noundef %arg2) {
156; CHECK-LABEL: @fshr_i32(
157; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
158; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.fshr.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]], i32 [[ARG2:%.*]])
159; CHECK-NEXT:    ret i32 [[CALL]]
160;
161  %call = call i32 @llvm.fshr.i32(i32 %arg0, i32 %arg1, i32 %arg2)
162  %freeze = freeze i32 %call
163  ret i32 %freeze
164}
165
166define i32 @smax_i32(i32 %arg0, i32 noundef %arg1) {
167; CHECK-LABEL: @smax_i32(
168; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
169; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.smax.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])
170; CHECK-NEXT:    ret i32 [[CALL]]
171;
172  %call = call i32 @llvm.smax.i32(i32 %arg0, i32 %arg1)
173  %freeze = freeze i32 %call
174  ret i32 %freeze
175}
176
177define i32 @smin_i32(i32 %arg0, i32 noundef %arg1) {
178; CHECK-LABEL: @smin_i32(
179; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
180; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.smin.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])
181; CHECK-NEXT:    ret i32 [[CALL]]
182;
183  %call = call i32 @llvm.smin.i32(i32 %arg0, i32 %arg1)
184  %freeze = freeze i32 %call
185  ret i32 %freeze
186}
187
188define i32 @umax_i32(i32 %arg0, i32 noundef %arg1) {
189; CHECK-LABEL: @umax_i32(
190; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
191; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.umax.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])
192; CHECK-NEXT:    ret i32 [[CALL]]
193;
194  %call = call i32 @llvm.umax.i32(i32 %arg0, i32 %arg1)
195  %freeze = freeze i32 %call
196  ret i32 %freeze
197}
198
199define i32 @umin_i32(i32 %arg0, i32 noundef %arg1) {
200; CHECK-LABEL: @umin_i32(
201; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
202; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.umin.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])
203; CHECK-NEXT:    ret i32 [[CALL]]
204;
205  %call = call i32 @llvm.umin.i32(i32 %arg0, i32 %arg1)
206  %freeze = freeze i32 %call
207  ret i32 %freeze
208}
209
210define ptr @ptrmask_p0(ptr %arg0, i64 noundef %arg1) {
211; CHECK-LABEL: @ptrmask_p0(
212; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze ptr [[ARG0:%.*]]
213; CHECK-NEXT:    [[CALL:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[ARG0_FR]], i64 [[ARG1:%.*]])
214; CHECK-NEXT:    ret ptr [[CALL]]
215;
216  %call = call ptr @llvm.ptrmask.p0.i64(ptr %arg0, i64 %arg1)
217  %freeze = freeze ptr %call
218  ret ptr %freeze
219}
220
221define i32 @fptoui_sat(float %arg) {
222; CHECK-LABEL: @fptoui_sat(
223; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
224; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.fptoui.sat.i32.f32(float [[ARG_FR]])
225; CHECK-NEXT:    ret i32 [[CALL]]
226;
227  %call = call i32 @llvm.fptoui.sat.i32.f32(float %arg)
228  %freeze = freeze i32 %call
229  ret i32 %freeze
230}
231
232define i32 @fptosi_sat(float %arg) {
233; CHECK-LABEL: @fptosi_sat(
234; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
235; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.fptosi.sat.i32.f32(float [[ARG_FR]])
236; CHECK-NEXT:    ret i32 [[CALL]]
237;
238  %call = call i32 @llvm.fptosi.sat.i32.f32(float %arg)
239  %freeze = freeze i32 %call
240  ret i32 %freeze
241}
242
243define i32 @sadd_sat_i32(i32 %arg0, i32 noundef %arg1) {
244; CHECK-LABEL: @sadd_sat_i32(
245; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
246; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.sadd.sat.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])
247; CHECK-NEXT:    ret i32 [[CALL]]
248;
249  %call = call i32 @llvm.sadd.sat.i32(i32 %arg0, i32 %arg1)
250  %freeze = freeze i32 %call
251  ret i32 %freeze
252}
253
254define i32 @uadd_sat_i32(i32 %arg0, i32 noundef %arg1) {
255; CHECK-LABEL: @uadd_sat_i32(
256; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
257; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.uadd.sat.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])
258; CHECK-NEXT:    ret i32 [[CALL]]
259;
260  %call = call i32 @llvm.uadd.sat.i32(i32 %arg0, i32 %arg1)
261  %freeze = freeze i32 %call
262  ret i32 %freeze
263}
264
265define i32 @ssub_sat_i32(i32 %arg0, i32 noundef %arg1) {
266; CHECK-LABEL: @ssub_sat_i32(
267; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
268; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.ssub.sat.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])
269; CHECK-NEXT:    ret i32 [[CALL]]
270;
271  %call = call i32 @llvm.ssub.sat.i32(i32 %arg0, i32 %arg1)
272  %freeze = freeze i32 %call
273  ret i32 %freeze
274}
275
276define i32 @usub_sat_i32(i32 %arg0, i32 noundef %arg1) {
277; CHECK-LABEL: @usub_sat_i32(
278; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
279; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])
280; CHECK-NEXT:    ret i32 [[CALL]]
281;
282  %call = call i32 @llvm.usub.sat.i32(i32 %arg0, i32 %arg1)
283  %freeze = freeze i32 %call
284  ret i32 %freeze
285}
286
287define i32 @sshl_sat_i32(i32 %arg0, i32 noundef %arg1) {
288; CHECK-LABEL: @sshl_sat_i32(
289; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.sshl.sat.i32(i32 [[ARG0:%.*]], i32 [[ARG1:%.*]])
290; CHECK-NEXT:    [[FREEZE:%.*]] = freeze i32 [[CALL]]
291; CHECK-NEXT:    ret i32 [[FREEZE]]
292;
293  %call = call i32 @llvm.sshl.sat.i32(i32 %arg0, i32 %arg1)
294  %freeze = freeze i32 %call
295  ret i32 %freeze
296}
297
298define i32 @ushl_sat_i32(i32 %arg0, i32 noundef %arg1) {
299; CHECK-LABEL: @ushl_sat_i32(
300; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.ushl.sat.i32(i32 [[ARG0:%.*]], i32 [[ARG1:%.*]])
301; CHECK-NEXT:    [[FREEZE:%.*]] = freeze i32 [[CALL]]
302; CHECK-NEXT:    ret i32 [[FREEZE]]
303;
304  %call = call i32 @llvm.ushl.sat.i32(i32 %arg0, i32 %arg1)
305  %freeze = freeze i32 %call
306  ret i32 %freeze
307}
308
309define i32 @sshl_sat_i32_safe_constant(i32 %arg0) {
310; CHECK-LABEL: @sshl_sat_i32_safe_constant(
311; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
312; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.sshl.sat.i32(i32 [[ARG0_FR]], i32 8)
313; CHECK-NEXT:    ret i32 [[CALL]]
314;
315  %call = call i32 @llvm.sshl.sat.i32(i32 %arg0, i32 8)
316  %freeze = freeze i32 %call
317  ret i32 %freeze
318}
319
320define i32 @ushl_sat_i32_safe_constant(i32 %arg0) {
321; CHECK-LABEL: @ushl_sat_i32_safe_constant(
322; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
323; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.ushl.sat.i32(i32 [[ARG0_FR]], i32 8)
324; CHECK-NEXT:    ret i32 [[CALL]]
325;
326  %call = call i32 @llvm.ushl.sat.i32(i32 %arg0, i32 8)
327  %freeze = freeze i32 %call
328  ret i32 %freeze
329}
330
331define i32 @sshl_sat_i32_unsafe_constant(i32 %arg0) {
332; CHECK-LABEL: @sshl_sat_i32_unsafe_constant(
333; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.sshl.sat.i32(i32 [[ARG0:%.*]], i32 32)
334; CHECK-NEXT:    [[FREEZE:%.*]] = freeze i32 [[CALL]]
335; CHECK-NEXT:    ret i32 [[FREEZE]]
336;
337  %call = call i32 @llvm.sshl.sat.i32(i32 %arg0, i32 32)
338  %freeze = freeze i32 %call
339  ret i32 %freeze
340}
341
342define i32 @ushl_sat_i32_unsafe_constant(i32 %arg0) {
343; CHECK-LABEL: @ushl_sat_i32_unsafe_constant(
344; CHECK-NEXT:    [[CALL:%.*]] = call i32 @llvm.ushl.sat.i32(i32 [[ARG0:%.*]], i32 32)
345; CHECK-NEXT:    [[FREEZE:%.*]] = freeze i32 [[CALL]]
346; CHECK-NEXT:    ret i32 [[FREEZE]]
347;
348  %call = call i32 @llvm.ushl.sat.i32(i32 %arg0, i32 32)
349  %freeze = freeze i32 %call
350  ret i32 %freeze
351}
352
353define <2 x i32> @sshl_sat_v2i32_safe_constant(<2 x i32> %arg0) {
354; CHECK-LABEL: @sshl_sat_v2i32_safe_constant(
355; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze <2 x i32> [[ARG0:%.*]]
356; CHECK-NEXT:    [[CALL:%.*]] = call <2 x i32> @llvm.sshl.sat.v2i32(<2 x i32> [[ARG0_FR]], <2 x i32> <i32 8, i32 9>)
357; CHECK-NEXT:    ret <2 x i32> [[CALL]]
358;
359  %call = call <2 x i32> @llvm.sshl.sat.v2i32(<2 x i32> %arg0, <2 x i32> <i32 8, i32 9>)
360  %freeze = freeze <2 x i32> %call
361  ret <2 x i32> %freeze
362}
363
364define <2 x i32> @ushl_sat_v2i32_safe_constant_vector(<2 x i32> %arg0) {
365; CHECK-LABEL: @ushl_sat_v2i32_safe_constant_vector(
366; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze <2 x i32> [[ARG0:%.*]]
367; CHECK-NEXT:    [[CALL:%.*]] = call <2 x i32> @llvm.ushl.sat.v2i32(<2 x i32> [[ARG0_FR]], <2 x i32> <i32 8, i32 9>)
368; CHECK-NEXT:    ret <2 x i32> [[CALL]]
369;
370  %call = call <2 x i32> @llvm.ushl.sat.v2i32(<2 x i32> %arg0, <2 x i32> <i32 8, i32 9>)
371  %freeze = freeze <2 x i32> %call
372  ret <2 x i32> %freeze
373}
374
375define <2 x i32> @ushl_sat_v2i32_unsafe_constant_vector(<2 x i32> %arg0) {
376; CHECK-LABEL: @ushl_sat_v2i32_unsafe_constant_vector(
377; CHECK-NEXT:    [[CALL:%.*]] = call <2 x i32> @llvm.ushl.sat.v2i32(<2 x i32> [[ARG0:%.*]], <2 x i32> <i32 undef, i32 9>)
378; CHECK-NEXT:    [[FREEZE:%.*]] = freeze <2 x i32> [[CALL]]
379; CHECK-NEXT:    ret <2 x i32> [[FREEZE]]
380;
381  %call = call <2 x i32> @llvm.ushl.sat.v2i32(<2 x i32> %arg0, <2 x i32> <i32 undef, i32 9>)
382  %freeze = freeze <2 x i32> %call
383  ret <2 x i32> %freeze
384}
385
386define <2 x i32> @sshl_sat_v2i32_unsafe_constant_vector(<2 x i32> %arg0) {
387; CHECK-LABEL: @sshl_sat_v2i32_unsafe_constant_vector(
388; CHECK-NEXT:    [[CALL:%.*]] = call <2 x i32> @llvm.sshl.sat.v2i32(<2 x i32> [[ARG0:%.*]], <2 x i32> <i32 undef, i32 9>)
389; CHECK-NEXT:    [[FREEZE:%.*]] = freeze <2 x i32> [[CALL]]
390; CHECK-NEXT:    ret <2 x i32> [[FREEZE]]
391;
392  %call = call <2 x i32> @llvm.sshl.sat.v2i32(<2 x i32> %arg0, <2 x i32> <i32 undef, i32 9>)
393  %freeze = freeze <2 x i32> %call
394  ret <2 x i32> %freeze
395}
396
397define <vscale x 2 x i32> @ushl_sat_v2i32_scalable_zeroinitializer(<vscale x 2 x i32> %arg0) {
398; CHECK-LABEL: @ushl_sat_v2i32_scalable_zeroinitializer(
399; CHECK-NEXT:    [[CALL:%.*]] = call <vscale x 2 x i32> @llvm.ushl.sat.nxv2i32(<vscale x 2 x i32> [[ARG0:%.*]], <vscale x 2 x i32> zeroinitializer)
400; CHECK-NEXT:    [[FREEZE:%.*]] = freeze <vscale x 2 x i32> [[CALL]]
401; CHECK-NEXT:    ret <vscale x 2 x i32> [[FREEZE]]
402;
403  %call = call <vscale x 2 x i32> @llvm.ushl.sat.nxv2i32(<vscale x 2 x i32> %arg0, <vscale x 2 x i32> zeroinitializer)
404  %freeze = freeze <vscale x 2 x i32> %call
405  ret <vscale x 2 x i32> %freeze
406}
407
408define <vscale x 2 x i32> @sshl_sat_v2i32_scalable_zeroinitializer(<vscale x 2 x i32> %arg0) {
409; CHECK-LABEL: @sshl_sat_v2i32_scalable_zeroinitializer(
410; CHECK-NEXT:    [[CALL:%.*]] = call <vscale x 2 x i32> @llvm.sshl.sat.nxv2i32(<vscale x 2 x i32> [[ARG0:%.*]], <vscale x 2 x i32> zeroinitializer)
411; CHECK-NEXT:    [[FREEZE:%.*]] = freeze <vscale x 2 x i32> [[CALL]]
412; CHECK-NEXT:    ret <vscale x 2 x i32> [[FREEZE]]
413;
414  %call = call <vscale x 2 x i32> @llvm.sshl.sat.nxv2i32(<vscale x 2 x i32> %arg0, <vscale x 2 x i32> zeroinitializer)
415  %freeze = freeze <vscale x 2 x i32> %call
416  ret <vscale x 2 x i32> %freeze
417}
418
419define i1 @widenable_condition() {
420; CHECK-LABEL: @widenable_condition(
421; CHECK-NEXT:    [[WC:%.*]] = call i1 @llvm.experimental.widenable.condition()
422; CHECK-NEXT:    ret i1 [[WC]]
423;
424  %wc = call i1 @llvm.experimental.widenable.condition()
425  %freeze = freeze i1 %wc
426  ret i1 %freeze
427}
428
429declare i32 @llvm.ctlz.i32(i32, i1 immarg)
430declare i32 @llvm.cttz.i32(i32, i1 immarg)
431declare i32 @llvm.abs.i32(i32, i1 immarg)
432declare i32 @llvm.bswap.i32(i32)
433declare i32 @llvm.bitreverse.i32(i32)
434declare i32 @llvm.fshl.i32(i32, i32, i32)
435declare i32 @llvm.fshr.i32(i32, i32, i32)
436declare i32 @llvm.smax.i32(i32, i32)
437declare i32 @llvm.smin.i32(i32, i32)
438declare i32 @llvm.umax.i32(i32, i32)
439declare i32 @llvm.umin.i32(i32, i32)
440declare ptr @llvm.ptrmask.p0.i64(ptr, i64)
441declare i32 @llvm.fptoui.sat.i32.f32(float)
442declare i32 @llvm.fptosi.sat.i32.f32(float)
443declare i32 @llvm.sadd.sat.i32(i32, i32)
444declare i32 @llvm.uadd.sat.i32(i32, i32)
445declare i32 @llvm.ssub.sat.i32(i32, i32)
446declare i32 @llvm.usub.sat.i32(i32, i32)
447declare i32 @llvm.sshl.sat.i32(i32, i32)
448declare i32 @llvm.ushl.sat.i32(i32, i32)
449declare <2 x i32> @llvm.sshl.sat.v2i32(<2 x i32>, <2 x i32>)
450declare <2 x i32> @llvm.ushl.sat.v2i32(<2 x i32>, <2 x i32>)
451declare <vscale x 2 x i32> @llvm.sshl.sat.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>)
452declare <vscale x 2 x i32> @llvm.ushl.sat.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>)
453declare i1 @llvm.experimental.widenable.condition()
454