[DAGCombiner] Eliminate dead stores to stack.
[llvm-complete.git] / test / CodeGen / ARM / GlobalISel / arm-legalize-bitcounts.mir
blob962dd844b28426b191bb8a4e82239bdd2ac6cb97
1 # RUN: llc -O0 -mtriple arm-linux-gnueabi -mattr=+v5t -run-pass=legalizer %s -o - | FileCheck %s -check-prefixes=CHECK,CLZ
2 # RUN: llc -O0 -mtriple arm-linux-gnueabi -mattr=-v5t -run-pass=legalizer %s -o - | FileCheck %s -check-prefixes=CHECK,LIBCALLS
3 --- |
4   define void @test_ctlz_s32() { ret void }
5   define void @test_ctlz_zero_undef_s32() { ret void }
7   ; same as above but with extensions
8   define void @test_ctlz_s16() { ret void }
9   define void @test_ctlz_zero_undef_s8() { ret void }
10 ...
11 ---
12 name:            test_ctlz_s32
13 # CHECK-LABEL: name: test_ctlz_s32
14 legalized:       false
15 # CHECK: legalized: true
16 regBankSelected: false
17 selected:        false
18 tracksRegLiveness: true
19 registers:
20   - { id: 0, class: _ }
21   - { id: 1, class: _ }
22 body:             |
23   bb.0:
24     liveins: $r0
26     ; CHECK: [[X:%[0-9]+]]:_(s32) = COPY $r0
27     %0(s32) = COPY $r0
29     ; CLZ: [[R:%[0-9]+]]:_(s32) = G_CTLZ [[X]]
30     ; LIBCALLS-NOT: G_CTLZ
31     ; LIBCALLS: ADJCALLSTACKDOWN
32     ; LIBCALLS: $r0 = COPY [[X]]
33     ; LIBCALLS: BL &__clzsi2, {{.*}}, implicit $r0, implicit-def $r0
34     ; LIBCALLS: [[COUNT:%[0-9]+]]:_(s32) = COPY $r0
35     ; LIBCALLS: ADJCALLSTACKUP
36     ; LIBCALLS-NOT: G_CTLZ
37     ; LIBCALLS: [[ZERO:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
38     ; LIBCALLS: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 32
39     ; LIBCALLS: [[CMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[X]](s32), [[ZERO]]
40     ; LIBCALLS: [[R:%[0-9]+]]:_(s32) = G_SELECT [[CMP]](s1), [[BITS]], [[COUNT]]
41     ; LIBCALLS-NOT: G_CTLZ
42     %1(s32) = G_CTLZ %0
44     ; CHECK: $r0 = COPY [[R]]
45     $r0 = COPY %1(s32)
46     BX_RET 14, $noreg, implicit $r0
47 ...
48 ---
49 name:            test_ctlz_zero_undef_s32
50 # CHECK-LABEL: name: test_ctlz_zero_undef_s32
51 legalized:       false
52 # CHECK: legalized: true
53 regBankSelected: false
54 selected:        false
55 tracksRegLiveness: true
56 registers:
57   - { id: 0, class: _ }
58   - { id: 1, class: _ }
59 body:             |
60   bb.0:
61     liveins: $r0
63     ; CHECK: [[X:%[0-9]+]]:_(s32) = COPY $r0
64     %0(s32) = COPY $r0
66     ; CLZ: [[R:%[0-9]+]]:_(s32) = G_CTLZ [[X]]
67     ; LIBCALLS-NOT: G_CTLZ
68     ; LIBCALLS: ADJCALLSTACKDOWN
69     ; LIBCALLS: $r0 = COPY [[X]]
70     ; LIBCALLS: BL &__clzsi2, {{.*}}, implicit $r0, implicit-def $r0
71     ; LIBCALLS: [[R:%[0-9]+]]:_(s32) = COPY $r0
72     ; LIBCALLS: ADJCALLSTACKUP
73     ; LIBCALLS-NOT: G_CTLZ
74     %1(s32) = G_CTLZ_ZERO_UNDEF %0
76     ; CHECK: $r0 = COPY [[R]]
77     $r0 = COPY %1(s32)
78     BX_RET 14, $noreg, implicit $r0
79 ...
80 ---
81 name:            test_ctlz_s16
82 # CHECK-LABEL: name: test_ctlz_s16
83 legalized:       false
84 # CHECK: legalized: true
85 regBankSelected: false
86 selected:        false
87 tracksRegLiveness: true
88 registers:
89   - { id: 0, class: _ }
90   - { id: 1, class: _ }
91   - { id: 2, class: _ }
92   - { id: 3, class: _ }
93 body:             |
94   bb.0:
95     liveins: $r0
97     ; CHECK: [[X:%[0-9]+]]:_(s32) = COPY $r0
98     ; CHECK: [[BITMASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
99     ; CHECK: [[XAGAIN:%[0-9]+]]:_(s32) = COPY [[X]]
100     ; CHECK: [[X32:%[0-9]+]]:_(s32) = G_AND [[XAGAIN]], [[BITMASK]]
101     %0(s32) = COPY $r0
102     %1(s16) = G_TRUNC %0(s32)
104     ; Check that the operation is performed for 32 bits
105     ; CLZ: [[COUNT:%[0-9]+]]:_(s32) = G_CTLZ [[X32]]
106     ; LIBCALLS-NOT: G_CTLZ
107     ; LIBCALLS: ADJCALLSTACKDOWN
108     ; LIBCALLS: $r0 = COPY [[X32]]
109     ; LIBCALLS: BL &__clzsi2, {{.*}}, implicit $r0, implicit-def $r0
110     ; LIBCALLS: [[UNDEFCOUNT:%[0-9]+]]:_(s32) = COPY $r0
111     ; LIBCALLS: ADJCALLSTACKUP
112     ; LIBCALLS-NOT: G_CTLZ
113     ; LIBCALLS: [[ZERO:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
114     ; LIBCALLS: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 32
115     ; LIBCALLS: [[CMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), {{%[0-9]+}}(s32), [[ZERO]]
116     ; LIBCALLS: [[COUNT:%[0-9]+]]:_(s32) = G_SELECT [[CMP]](s1), [[BITS]], [[UNDEFCOUNT]]
117     ; LIBCALLS-NOT: G_CTLZ
118     ; CHECK: [[BITDIFF:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
119     ; CHECK: [[R32:%[0-9]+]]:_(s32) = G_SUB [[COUNT]], [[BITDIFF]]
120     %2(s16) = G_CTLZ %1
122     ; CHECK: [[BITDIFF:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
123     ; CHECK: [[RAGAIN:%[0-9]+]]:_(s32) = COPY [[R32]]
124     ; CHECK: [[SHIFTEDR:%[0-9]+]]:_(s32) = G_SHL [[RAGAIN]], [[BITDIFF]]
125     ; CHECK: [[R:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDR]], [[BITDIFF]]
126     ; CHECK: $r0 = COPY [[R]]
127     %3(s32) = G_SEXT %2(s16)
128     $r0 = COPY %3(s32)
129     BX_RET 14, $noreg, implicit $r0
132 name:            test_ctlz_zero_undef_s8
133 # CHECK-LABEL: name: test_ctlz_zero_undef_s8
134 legalized:       false
135 # CHECK: legalized: true
136 regBankSelected: false
137 selected:        false
138 tracksRegLiveness: true
139 registers:
140   - { id: 0, class: _ }
141   - { id: 1, class: _ }
142   - { id: 2, class: _ }
143   - { id: 3, class: _ }
144 body:             |
145   bb.0:
146     liveins: $r0
148     ; CHECK: [[X:%[0-9]+]]:_(s32) = COPY $r0
149     ; CHECK: [[BITMASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
150     ; CHECK: [[XAGAIN:%[0-9]+]]:_(s32) = COPY [[X]]
151     ; CHECK: [[X32:%[0-9]+]]:_(s32) = G_AND [[XAGAIN]], [[BITMASK]]
152     %0(s32) = COPY $r0
153     %1(s8) = G_TRUNC %0(s32)
155     ; Check that the operation is performed for 32 bits
156     ; CLZ: [[COUNT:%[0-9]+]]:_(s32) = G_CTLZ
157     ; CLZ-NOT: G_CTLZ_ZERO_UNDEF
158     ; LIBCALLS-NOT: G_CTLZ
159     ; LIBCALLS: ADJCALLSTACKDOWN
160     ; LIBCALLS: $r0 = COPY [[X32]]
161     ; LIBCALLS: BL &__clzsi2, {{.*}}, implicit $r0, implicit-def $r0
162     ; LIBCALLS: [[COUNT:%[0-9]+]]:_(s32) = COPY $r0
163     ; LIBCALLS: ADJCALLSTACKUP
164     ; LIBCALLS-NOT: G_CTLZ
165     ; CHECK: [[BITDIFF:%[0-9]+]]:_(s32) = G_CONSTANT i32 24
166     ; CHECK: [[R32:%[0-9]+]]:_(s32) = G_SUB [[COUNT]], [[BITDIFF]]
167     %2(s8) = G_CTLZ_ZERO_UNDEF %1
169     ; CHECK: [[BITDIFF:%[0-9]+]]:_(s32) = G_CONSTANT i32 24
170     ; CHECK: [[RAGAIN:%[0-9]+]]:_(s32) = COPY [[R32]]
171     ; CHECK: [[SHIFTEDR:%[0-9]+]]:_(s32) = G_SHL [[RAGAIN]], [[BITDIFF]]
172     ; CHECK: [[R:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDR]], [[BITDIFF]]
173     ; CHECK: $r0 = COPY [[R]]
174     %3(s32) = G_SEXT %2(s8)
175     $r0 = COPY %3(s32)
176     BX_RET 14, $noreg, implicit $r0