xref: /llvm-project/llvm/test/Analysis/DemandedBits/intrinsics.ll (revision 99b3b8e5b9ee234ab783a1f6079e1901bb1c9240)
1; RUN: opt -S -disable-output -passes="print<demanded-bits>" < %s 2>&1 | FileCheck %s
2
3; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_bswap':
4; CHECK-DAG: DemandedBits: 0xff000000 for   %1 = or i32 %x, 1
5; CHECK-DAG: DemandedBits: 0xff for   %2 = call i32 @llvm.bswap.i32(i32 %1)
6; CHECK-DAG: DemandedBits: 0xff for   %3 = trunc i32 %2 to i8
7define i8 @test_bswap(i32 %x) {
8  %1 = or i32 %x, 1
9  %2 = call i32 @llvm.bswap.i32(i32 %1)
10  %3 = trunc i32 %2 to i8
11  ret i8 %3
12}
13declare i32 @llvm.bswap.i32(i32)
14
15; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_bitreverse':
16; CHECK-DAG: DemandedBits: 0xff000000 for   %1 = or i32 %x, 1
17; CHECK-DAG: DemandedBits: 0xff for   %2 = call i32 @llvm.bitreverse.i32(i32 %1)
18; CHECK-DAG: DemandedBits: 0xff for   %3 = trunc i32 %2 to i8
19define i8 @test_bitreverse(i32 %x) {
20  %1 = or i32 %x, 1
21  %2 = call i32 @llvm.bitreverse.i32(i32 %1)
22  %3 = trunc i32 %2 to i8
23  ret i8 %3
24}
25declare i32 @llvm.bitreverse.i32(i32)
26
27; Funnel shifts
28declare i32 @llvm.fshl.i32(i32, i32, i32)
29declare i33 @llvm.fshr.i33(i33, i33, i33)
30
31; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_fshl':
32; CHECK-DAG: DemandedBits: 0xff for   %x2 = or i32 %x, 1
33; CHECK-DAG: DemandedBits: 0xff000000 for   %y2 = or i32 %y, 1
34; CHECK-DAG: DemandedBits: 0xffff for   %z = call i32 @llvm.fshl.i32(i32 %x2, i32 %y2, i32 8)
35; CHECK-DAG: DemandedBits: 0xffffffff for   %r = and i32 %z, 65535
36define i32 @test_fshl(i32 %x, i32 %y) {
37  %x2 = or i32 %x, 1
38  %y2 = or i32 %y, 1
39  %z = call i32 @llvm.fshl.i32(i32 %x2, i32 %y2, i32 8)
40  %r = and i32 %z, 65535
41  ret i32 %r
42}
43
44; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_fshr':
45; CHECK-DAG: DemandedBits: 0xff for   %x2 = or i33 %x, 1
46; CHECK-DAG: DemandedBits: 0x1fe000000 for   %y2 = or i33 %y, 1
47; CHECK-DAG: DemandedBits: 0xffff for   %z = call i33 @llvm.fshr.i33(i33 %x2, i33 %y2, i33 25)
48; CHECK-DAG: DemandedBits: 0x1ffffffff for   %r = and i33 %z, 65535
49define i33 @test_fshr(i33 %x, i33 %y) {
50  %x2 = or i33 %x, 1
51  %y2 = or i33 %y, 1
52  %z = call i33 @llvm.fshr.i33(i33 %x2, i33 %y2, i33 25)
53  %r = and i33 %z, 65535
54  ret i33 %r
55}
56
57; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_fshl_zero_shift':
58; CHECK-DAG: DemandedBits: 0xffff for   %x2 = or i32 %x, 1
59; CHECK-DAG: DemandedBits: 0x0 for   %y2 = or i32 %y, 1
60; CHECK-DAG: DemandedBits: 0xffff for   %z = call i32 @llvm.fshl.i32(i32 %x2, i32 %y2, i32 0)
61; CHECK-DAG: DemandedBits: 0xffffffff for   %r = and i32 %z, 65535
62define i32 @test_fshl_zero_shift(i32 %x, i32 %y) {
63  %x2 = or i32 %x, 1
64  %y2 = or i32 %y, 1
65  %z = call i32 @llvm.fshl.i32(i32 %x2, i32 %y2, i32 0)
66  %r = and i32 %z, 65535
67  ret i32 %r
68}
69
70; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_fshr_full_shift':
71; CHECK-DAG: DemandedBits: 0x0 for   %x2 = or i33 %x, 1
72; CHECK-DAG: DemandedBits: 0xffff for   %y2 = or i33 %y, 1
73; CHECK-DAG: DemandedBits: 0xffff for   %z = call i33 @llvm.fshr.i33(i33 %x2, i33 %y2, i33 33)
74; CHECK-DAG: DemandedBits: 0x1ffffffff for   %r = and i33 %z, 65535
75define i33 @test_fshr_full_shift(i33 %x, i33 %y) {
76  %x2 = or i33 %x, 1
77  %y2 = or i33 %y, 1
78  %z = call i33 @llvm.fshr.i33(i33 %x2, i33 %y2, i33 33)
79  %r = and i33 %z, 65535
80  ret i33 %r
81}
82
83; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_fshl_pow2_bitwidth':
84; CHECK-DAG: DemandedBits: 0xffffffff for   %x2 = or i32 %x, 1
85; CHECK-DAG: DemandedBits: 0xffffffff for   %y2 = or i32 %y, 1
86; CHECK-DAG: DemandedBits: 0x1f for   %z2 = or i32 %z, 1
87; CHECK-DAG: DemandedBits: 0xffff for   %f = call i32 @llvm.fshl.i32(i32 %x2, i32 %y2, i32 %z2)
88; CHECK-DAG: DemandedBits: 0xffffffff for   %r = and i32 %f, 65535
89define i32 @test_fshl_pow2_bitwidth(i32 %x, i32 %y, i32 %z) {
90  %x2 = or i32 %x, 1
91  %y2 = or i32 %y, 1
92  %z2 = or i32 %z, 1
93  %f = call i32 @llvm.fshl.i32(i32 %x2, i32 %y2, i32 %z2)
94  %r = and i32 %f, 65535
95  ret i32 %r
96}
97
98; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_fshr_non_pow2_bitwidth':
99; CHECK-DAG: DemandedBits: 0x1ffffffff for   %x2 = or i33 %x, 1
100; CHECK-DAG: DemandedBits: 0x1ffffffff for   %y2 = or i33 %y, 1
101; CHECK-DAG: DemandedBits: 0x1ffffffff for   %z2 = or i33 %z, 1
102; CHECK-DAG: DemandedBits: 0xffff for   %f = call i33 @llvm.fshr.i33(i33 %x2, i33 %y2, i33 %z2)
103; CHECK-DAG: DemandedBits: 0x1ffffffff for   %r = and i33 %f, 65535
104define i33 @test_fshr_non_pow2_bitwidth(i33 %x, i33 %y, i33 %z) {
105  %x2 = or i33 %x, 1
106  %y2 = or i33 %y, 1
107  %z2 = or i33 %z, 1
108  %f = call i33 @llvm.fshr.i33(i33 %x2, i33 %y2, i33 %z2)
109  %r = and i33 %f, 65535
110  ret i33 %r
111}
112