xref: /llvm-project/llvm/test/Transforms/InstCombine/X86/x86-bmi-tbm.ll (revision acdc419c897f8a9414c7a00c8908ac32312afee2)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instcombine -mtriple=x86_64-unknown-unknown -S | FileCheck %s
3
4declare i32 @llvm.x86.tbm.bextri.u32(i32, i32) nounwind readnone
5declare i64 @llvm.x86.tbm.bextri.u64(i64, i64) nounwind readnone
6declare i32 @llvm.x86.bmi.bextr.32(i32, i32) nounwind readnone
7declare i64 @llvm.x86.bmi.bextr.64(i64, i64) nounwind readnone
8declare i32 @llvm.x86.bmi.bzhi.32(i32, i32) nounwind readnone
9declare i64 @llvm.x86.bmi.bzhi.64(i64, i64) nounwind readnone
10declare i32 @llvm.x86.bmi.pext.32(i32, i32) nounwind readnone
11declare i64 @llvm.x86.bmi.pext.64(i64, i64) nounwind readnone
12declare i32 @llvm.x86.bmi.pdep.32(i32, i32) nounwind readnone
13declare i64 @llvm.x86.bmi.pdep.64(i64, i64) nounwind readnone
14
15define i32 @test_x86_tbm_bextri_u32(i32 %a) nounwind readnone {
16; CHECK-LABEL: @test_x86_tbm_bextri_u32(
17; CHECK-NEXT:    [[TMP1:%.*]] = tail call i32 @llvm.x86.tbm.bextri.u32(i32 [[A:%.*]], i32 1296)
18; CHECK-NEXT:    ret i32 [[TMP1]]
19;
20  %1 = tail call i32 @llvm.x86.tbm.bextri.u32(i32 %a, i32 1296)
21  ret i32 %1
22}
23
24define i32 @test_x86_tbm_bextri_u32_zero_length(i32 %a) nounwind readnone {
25; CHECK-LABEL: @test_x86_tbm_bextri_u32_zero_length(
26; CHECK-NEXT:    ret i32 0
27;
28  %1 = tail call i32 @llvm.x86.tbm.bextri.u32(i32 %a, i32 1)
29  ret i32 %1
30}
31
32define i32 @test_x86_tbm_bextri_u32_large_shift(i32 %a) nounwind readnone {
33; CHECK-LABEL: @test_x86_tbm_bextri_u32_large_shift(
34; CHECK-NEXT:    ret i32 0
35;
36  %1 = tail call i32 @llvm.x86.tbm.bextri.u32(i32 %a, i32 288)
37  ret i32 %1
38}
39
40define i64 @test_x86_tbm_bextri_u64(i64 %a) nounwind readnone {
41; CHECK-LABEL: @test_x86_tbm_bextri_u64(
42; CHECK-NEXT:    [[TMP1:%.*]] = tail call i64 @llvm.x86.tbm.bextri.u64(i64 [[A:%.*]], i64 1312)
43; CHECK-NEXT:    ret i64 [[TMP1]]
44;
45  %1 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 %a, i64 1312)
46  ret i64 %1
47}
48
49define i64 @test_x86_tbm_bextri_u64_zero_length(i64 %a) nounwind readnone {
50; CHECK-LABEL: @test_x86_tbm_bextri_u64_zero_length(
51; CHECK-NEXT:    ret i64 0
52;
53  %1 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 %a, i64 1)
54  ret i64 %1
55}
56
57define i64 @test_x86_tbm_bextri_u64_large_shift(i64 %a) nounwind readnone {
58; CHECK-LABEL: @test_x86_tbm_bextri_u64_large_shift(
59; CHECK-NEXT:    ret i64 0
60;
61  %1 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 %a, i64 320)
62  ret i64 %1
63}
64
65define i32 @test_x86_tbm_bextri_u32_constfold() nounwind readnone {
66; CHECK-LABEL: @test_x86_tbm_bextri_u32_constfold(
67; CHECK-NEXT:    ret i32 57005
68;
69  %1 = tail call i32 @llvm.x86.tbm.bextri.u32(i32 3735928559, i32 4112) ; extract bits 31:16 from 0xDEADBEEF
70  ret i32 %1
71}
72
73define i32 @test_x86_tbm_bextri_u32_constfold2() nounwind readnone {
74; CHECK-LABEL: @test_x86_tbm_bextri_u32_constfold2(
75; CHECK-NEXT:    ret i32 233495534
76;
77  %1 = tail call i32 @llvm.x86.tbm.bextri.u32(i32 3735928559, i32 8196) ; extract bits 35:4 from 0xDEADBEEF
78  ret i32 %1
79}
80
81define i32 @test_x86_tbm_bextri_u32_constfold3() nounwind readnone {
82; CHECK-LABEL: @test_x86_tbm_bextri_u32_constfold3(
83; CHECK-NEXT:    ret i32 233495534
84;
85  %1 = tail call i32 @llvm.x86.tbm.bextri.u32(i32 3735928559, i32 16388) ; extract bits 67:4 from 0xDEADBEEF
86  ret i32 %1
87}
88
89define i64 @test_x86_tbm_bextri_u64_constfold() nounwind readnone {
90; CHECK-LABEL: @test_x86_tbm_bextri_u64_constfold(
91; CHECK-NEXT:    ret i64 57005
92;
93  %1 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 3735928559, i64 4112) ; extract bits 31:16 from 0xDEADBEEF
94  ret i64 %1
95}
96
97define i64 @test_x86_tbm_bextri_u64_constfold2() nounwind readnone {
98; CHECK-LABEL: @test_x86_tbm_bextri_u64_constfold2(
99; CHECK-NEXT:    ret i64 233495534
100;
101  %1 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 3735928559, i64 16388) ; extract bits 67:4 from 0xDEADBEEF
102  ret i64 %1
103}
104
105define i64 @test_x86_tbm_bextri_u64_constfold3() nounwind readnone {
106; CHECK-LABEL: @test_x86_tbm_bextri_u64_constfold3(
107; CHECK-NEXT:    ret i64 233495534
108;
109  %1 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 3735928559, i64 32772) ; extract bits 131:4 from 0xDEADBEEF
110  ret i64 %1
111}
112
113define i32 @test_x86_bmi_bextri_32(i32 %a) nounwind readnone {
114; CHECK-LABEL: @test_x86_bmi_bextri_32(
115; CHECK-NEXT:    [[TMP1:%.*]] = tail call i32 @llvm.x86.bmi.bextr.32(i32 [[A:%.*]], i32 1296)
116; CHECK-NEXT:    ret i32 [[TMP1]]
117;
118  %1 = tail call i32 @llvm.x86.bmi.bextr.32(i32 %a, i32 1296)
119  ret i32 %1
120}
121
122define i32 @test_x86_bmi_bextri_32_zero_length(i32 %a) nounwind readnone {
123; CHECK-LABEL: @test_x86_bmi_bextri_32_zero_length(
124; CHECK-NEXT:    ret i32 0
125;
126  %1 = tail call i32 @llvm.x86.bmi.bextr.32(i32 %a, i32 1)
127  ret i32 %1
128}
129
130define i32 @test_x86_bmi_bextri_32_large_shift(i32 %a) nounwind readnone {
131; CHECK-LABEL: @test_x86_bmi_bextri_32_large_shift(
132; CHECK-NEXT:    ret i32 0
133;
134  %1 = tail call i32 @llvm.x86.bmi.bextr.32(i32 %a, i32 288)
135  ret i32 %1
136}
137
138define i64 @test_x86_bmi_bextri_64(i64 %a) nounwind readnone {
139; CHECK-LABEL: @test_x86_bmi_bextri_64(
140; CHECK-NEXT:    [[TMP1:%.*]] = tail call i64 @llvm.x86.bmi.bextr.64(i64 [[A:%.*]], i64 1312)
141; CHECK-NEXT:    ret i64 [[TMP1]]
142;
143  %1 = tail call i64 @llvm.x86.bmi.bextr.64(i64 %a, i64 1312)
144  ret i64 %1
145}
146
147define i64 @test_x86_bmi_bextri_64_zero_length(i64 %a) nounwind readnone {
148; CHECK-LABEL: @test_x86_bmi_bextri_64_zero_length(
149; CHECK-NEXT:    ret i64 0
150;
151  %1 = tail call i64 @llvm.x86.bmi.bextr.64(i64 %a, i64 1)
152  ret i64 %1
153}
154
155define i64 @test_x86_bmi_bextri_64_large_shift(i64 %a) nounwind readnone {
156; CHECK-LABEL: @test_x86_bmi_bextri_64_large_shift(
157; CHECK-NEXT:    ret i64 0
158;
159  %1 = tail call i64 @llvm.x86.bmi.bextr.64(i64 %a, i64 320)
160  ret i64 %1
161}
162
163define i32 @test_x86_bmi_bextri_32_constfold() nounwind readnone {
164; CHECK-LABEL: @test_x86_bmi_bextri_32_constfold(
165; CHECK-NEXT:    ret i32 57005
166;
167  %1 = tail call i32 @llvm.x86.bmi.bextr.32(i32 3735928559, i32 4112) ; extract bits 31:16 from 0xDEADBEEF
168  ret i32 %1
169}
170
171define i32 @test_x86_bmi_bextri_32_constfold2() nounwind readnone {
172; CHECK-LABEL: @test_x86_bmi_bextri_32_constfold2(
173; CHECK-NEXT:    ret i32 233495534
174;
175  %1 = tail call i32 @llvm.x86.bmi.bextr.32(i32 3735928559, i32 8196) ; extract bits 35:4 from 0xDEADBEEF
176  ret i32 %1
177}
178
179define i32 @test_x86_bmi_bextri_32_constfold3() nounwind readnone {
180; CHECK-LABEL: @test_x86_bmi_bextri_32_constfold3(
181; CHECK-NEXT:    ret i32 233495534
182;
183  %1 = tail call i32 @llvm.x86.bmi.bextr.32(i32 3735928559, i32 16388) ; extract bits 67:4 from 0xDEADBEEF
184  ret i32 %1
185}
186
187define i64 @test_x86_bmi_bextri_64_constfold() nounwind readnone {
188; CHECK-LABEL: @test_x86_bmi_bextri_64_constfold(
189; CHECK-NEXT:    ret i64 57005
190;
191  %1 = tail call i64 @llvm.x86.bmi.bextr.64(i64 3735928559, i64 4112) ; extract bits 31:16 from 0xDEADBEEF
192  ret i64 %1
193}
194
195define i64 @test_x86_bmi_bextri_64_constfold2() nounwind readnone {
196; CHECK-LABEL: @test_x86_bmi_bextri_64_constfold2(
197; CHECK-NEXT:    ret i64 233495534
198;
199  %1 = tail call i64 @llvm.x86.bmi.bextr.64(i64 3735928559, i64 16388) ; extract bits 67:4 from 0xDEADBEEF
200  ret i64 %1
201}
202
203define i64 @test_x86_bmi_bextri_64_constfold3() nounwind readnone {
204; CHECK-LABEL: @test_x86_bmi_bextri_64_constfold3(
205; CHECK-NEXT:    ret i64 233495534
206;
207  %1 = tail call i64 @llvm.x86.bmi.bextr.64(i64 3735928559, i64 32772) ; extract bits 131:4 from 0xDEADBEEF
208  ret i64 %1
209}
210
211define i32 @test_x86_bmi_bzhi_32(i32 %a) nounwind readnone {
212; CHECK-LABEL: @test_x86_bmi_bzhi_32(
213; CHECK-NEXT:    [[TMP1:%.*]] = tail call i32 @llvm.x86.bmi.bzhi.32(i32 [[A:%.*]], i32 31)
214; CHECK-NEXT:    ret i32 [[TMP1]]
215;
216  %1 = tail call i32 @llvm.x86.bmi.bzhi.32(i32 %a, i32 31)
217  ret i32 %1
218}
219
220define i32 @test_x86_bmi_bzhi_32_zero(i32 %a) nounwind readnone {
221; CHECK-LABEL: @test_x86_bmi_bzhi_32_zero(
222; CHECK-NEXT:    ret i32 0
223;
224  %1 = tail call i32 @llvm.x86.bmi.bzhi.32(i32 %a, i32 0)
225  ret i32 %1
226}
227
228define i32 @test_x86_bmi_bzhi_32_max(i32 %a) nounwind readnone {
229; CHECK-LABEL: @test_x86_bmi_bzhi_32_max(
230; CHECK-NEXT:    ret i32 [[A:%.*]]
231;
232  %1 = tail call i32 @llvm.x86.bmi.bzhi.32(i32 %a, i32 32)
233  ret i32 %1
234}
235
236define i32 @test_x86_bmi_bzhi_32_constfold() nounwind readnone {
237; CHECK-LABEL: @test_x86_bmi_bzhi_32_constfold(
238; CHECK-NEXT:    ret i32 1
239;
240  %1 = tail call i32 @llvm.x86.bmi.bzhi.32(i32 5, i32 1)
241  ret i32 %1
242}
243
244define i64 @test_x86_bmi_bzhi_64(i64 %a) nounwind readnone {
245; CHECK-LABEL: @test_x86_bmi_bzhi_64(
246; CHECK-NEXT:    [[TMP1:%.*]] = tail call i64 @llvm.x86.bmi.bzhi.64(i64 [[A:%.*]], i64 63)
247; CHECK-NEXT:    ret i64 [[TMP1]]
248;
249  %1 = tail call i64 @llvm.x86.bmi.bzhi.64(i64 %a, i64 63)
250  ret i64 %1
251}
252
253define i64 @test_x86_bmi_bzhi_64_zero(i64 %a) nounwind readnone {
254; CHECK-LABEL: @test_x86_bmi_bzhi_64_zero(
255; CHECK-NEXT:    ret i64 0
256;
257  %1 = tail call i64 @llvm.x86.bmi.bzhi.64(i64 %a, i64 0)
258  ret i64 %1
259}
260
261define i64 @test_x86_bmi_bzhi_64_max(i64 %a) nounwind readnone {
262; CHECK-LABEL: @test_x86_bmi_bzhi_64_max(
263; CHECK-NEXT:    ret i64 [[A:%.*]]
264;
265  %1 = tail call i64 @llvm.x86.bmi.bzhi.64(i64 %a, i64 64)
266  ret i64 %1
267}
268
269define i64 @test_x86_bmi_bzhi_64_constfold() nounwind readnone {
270; CHECK-LABEL: @test_x86_bmi_bzhi_64_constfold(
271; CHECK-NEXT:    ret i64 1
272;
273  %1 = tail call i64 @llvm.x86.bmi.bzhi.64(i64 5, i64 1)
274  ret i64 %1
275}
276
277define i32 @test_x86_pext_32_zero_mask(i32 %x) nounwind readnone {
278; CHECK-LABEL: @test_x86_pext_32_zero_mask(
279; CHECK-NEXT:    ret i32 0
280;
281  %1 = tail call i32 @llvm.x86.bmi.pext.32(i32 %x, i32 0)
282  ret i32 %1
283}
284
285define i64 @test_x86_pext_64_zero_mask(i64 %x) nounwind readnone {
286; CHECK-LABEL: @test_x86_pext_64_zero_mask(
287; CHECK-NEXT:    ret i64 0
288;
289  %1 = tail call i64 @llvm.x86.bmi.pext.64(i64 %x, i64 0)
290  ret i64 %1
291}
292
293define i32 @test_x86_pext_32_allones_mask(i32 %x) nounwind readnone {
294; CHECK-LABEL: @test_x86_pext_32_allones_mask(
295; CHECK-NEXT:    ret i32 %x
296;
297  %1 = tail call i32 @llvm.x86.bmi.pext.32(i32 %x, i32 -1)
298  ret i32 %1
299}
300
301define i64 @test_x86_pext_64_allones_mask(i64 %x) nounwind readnone {
302; CHECK-LABEL: @test_x86_pext_64_allones_mask(
303; CHECK-NEXT:    ret i64 %x
304;
305  %1 = tail call i64 @llvm.x86.bmi.pext.64(i64 %x, i64 -1)
306  ret i64 %1
307}
308
309define i32 @test_x86_pext_32_shifted_mask(i32 %x) nounwind readnone {
310; CHECK-LABEL: @test_x86_pext_32_shifted_mask(
311; CHECK-NEXT:    %1 = lshr i32 %x, 1
312; CHECK-NEXT:    %2 = and i32 %1, 3
313; CHECK-NEXT:    ret i32 %2
314;
315  %1 = tail call i32 @llvm.x86.bmi.pext.32(i32 %x, i32 6)
316  ret i32 %1
317}
318
319define i64 @test_x86_pext_64_shifted_mask(i64 %x) nounwind readnone {
320; CHECK-LABEL: @test_x86_pext_64_shifted_mask(
321; CHECK-NEXT:    %1 = lshr i64 %x, 1
322; CHECK-NEXT:    %2 = and i64 %1, 3
323; CHECK-NEXT:    ret i64 %2
324;
325  %1 = tail call i64 @llvm.x86.bmi.pext.64(i64 %x, i64 6)
326  ret i64 %1
327}
328
329
330define i32 @test_x86_pext_32_constant_fold() nounwind readnone {
331; CHECK-LABEL: @test_x86_pext_32_constant_fold(
332; CHECK-NEXT:    ret i32 30001
333;
334  %1 = tail call i32 @llvm.x86.bmi.pext.32(i32 1985229328, i32 4042322160)
335  ret i32 %1
336}
337
338define i64 @test_x86_pext_64_constant_fold() nounwind readnone {
339; CHECK-LABEL: @test_x86_pext_64_constant_fold(
340; CHECK-NEXT:    ret i64 1966210489
341;
342  %1 = tail call i64 @llvm.x86.bmi.pext.64(i64 8526495043095935640, i64 -1085102592571150096)
343  ret i64 %1
344}
345
346define i32 @test_x86_pext_32_constant_fold_2() nounwind readnone {
347; CHECK-LABEL: @test_x86_pext_32_constant_fold_2(
348; CHECK-NEXT:    ret i32 30224
349;
350  %1 = tail call i32 @llvm.x86.bmi.pext.32(i32 1985229328, i32 4278190335)
351  ret i32 %1
352}
353
354define i64 @test_x86_pext_64_constant_fold_2() nounwind readnone {
355; CHECK-LABEL: @test_x86_pext_64_constant_fold_2(
356; CHECK-NEXT:    ret i64 1980816570
357;
358  %1 = tail call i64 @llvm.x86.bmi.pext.64(i64 8526495043095935640, i64 -72056498804490496)
359  ret i64 %1
360}
361
362define i32 @test_x86_pdep_32_zero_mask(i32 %x) nounwind readnone {
363; CHECK-LABEL: @test_x86_pdep_32_zero_mask(
364; CHECK-NEXT:    ret i32 0
365;
366  %1 = tail call i32 @llvm.x86.bmi.pdep.32(i32 %x, i32 0)
367  ret i32 %1
368}
369
370define i64 @test_x86_pdep_64_zero_mask(i64 %x) nounwind readnone {
371; CHECK-LABEL: @test_x86_pdep_64_zero_mask(
372; CHECK-NEXT:    ret i64 0
373;
374  %1 = tail call i64 @llvm.x86.bmi.pdep.64(i64 %x, i64 0)
375  ret i64 %1
376}
377
378define i32 @test_x86_pdep_32_allones_mask(i32 %x) nounwind readnone {
379; CHECK-LABEL: @test_x86_pdep_32_allones_mask(
380; CHECK-NEXT:    ret i32 %x
381;
382  %1 = tail call i32 @llvm.x86.bmi.pdep.32(i32 %x, i32 -1)
383  ret i32 %1
384}
385
386define i64 @test_x86_pdep_64_allones_mask(i64 %x) nounwind readnone {
387; CHECK-LABEL: @test_x86_pdep_64_allones_mask(
388; CHECK-NEXT:    ret i64 %x
389;
390  %1 = tail call i64 @llvm.x86.bmi.pdep.64(i64 %x, i64 -1)
391  ret i64 %1
392}
393
394define i32 @test_x86_pdep_32_shifted_mask(i32 %x) nounwind readnone {
395; CHECK-LABEL: @test_x86_pdep_32_shifted_mask(
396; CHECK-NEXT:    %1 = shl i32 %x, 2
397; CHECK-NEXT:    %2 = and i32 %1, 12
398; CHECK-NEXT:    ret i32 %2
399;
400  %1 = tail call i32 @llvm.x86.bmi.pdep.32(i32 %x, i32 12)
401  ret i32 %1
402}
403
404define i64 @test_x86_pdep_64_shifted_mask(i64 %x) nounwind readnone {
405; CHECK-LABEL: @test_x86_pdep_64_shifted_mask(
406; CHECK-NEXT:    %1 = shl i64 %x, 2
407; CHECK-NEXT:    %2 = and i64 %1, 12
408; CHECK-NEXT:    ret i64 %2
409;
410  %1 = tail call i64 @llvm.x86.bmi.pdep.64(i64 %x, i64 12)
411  ret i64 %1
412}
413
414
415define i32 @test_x86_pdep_32_constant_fold() nounwind readnone {
416; CHECK-LABEL: @test_x86_pdep_32_constant_fold(
417; CHECK-NEXT:    ret i32 807407616
418;
419  %1 = tail call i32 @llvm.x86.bmi.pdep.32(i32 1985229328, i32 4042322160)
420  ret i32 %1
421}
422
423define i64 @test_x86_pdep_64_constant_fold() nounwind readnone {
424; CHECK-LABEL: @test_x86_pdep_64_constant_fold(
425; CHECK-NEXT:    ret i64 -1089641583808049024
426;
427  %1 = tail call i64 @llvm.x86.bmi.pdep.64(i64 8526495043095935640, i64 -1085102592571150096)
428  ret i64 %1
429}
430
431define i32 @test_x86_pdep_32_constant_fold_2() nounwind readnone {
432; CHECK-LABEL: @test_x86_pdep_32_constant_fold_2(
433; CHECK-NEXT:    ret i32 838860816
434;
435  %1 = tail call i32 @llvm.x86.bmi.pdep.32(i32 1985229328, i32 4278190335)
436  ret i32 %1
437}
438
439define i64 @test_x86_pdep_64_constant_fold_2() nounwind readnone {
440; CHECK-LABEL: @test_x86_pdep_64_constant_fold_2(
441; CHECK-NEXT:    ret i64 -144114243170822144
442;
443  %1 = tail call i64 @llvm.x86.bmi.pdep.64(i64 8526495043095935640, i64 -72056498804490496)
444  ret i64 %1
445}
446