[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / opt-and-tbnz-tbz.mir
blob95ae12f6d59db518d281df9b58d3d616c8db637f
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple aarch64-unknown-unknown -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
4 # Verify that we can fold G_AND into G_BRCOND when all of the following hold:
5 #   1. We have a ne/eq G_ICMP feeding into the G_BRCOND
6 #   2. The G_ICMP is being compared against 0
7 #   3. One of the operands of the G_AND is a power of 2
9 # If all of these hold, we should produce a tbnz or a tbz.
10 ...
11 ---
12 name:            tbnzx_and
13 alignment:       4
14 legalized:       true
15 regBankSelected: true
16 body:             |
17   ; CHECK-LABEL: name: tbnzx_and
18   ; CHECK: bb.0:
19   ; CHECK-NEXT:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
20   ; CHECK-NEXT:   liveins: $x0
21   ; CHECK-NEXT: {{  $}}
22   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr64 = COPY $x0
23   ; CHECK-NEXT:   TBNZX [[COPY]], 33, %bb.1
24   ; CHECK-NEXT:   B %bb.0
25   ; CHECK-NEXT: {{  $}}
26   ; CHECK-NEXT: bb.1:
27   ; CHECK-NEXT:   RET_ReallyLR
28   bb.0:
29     successors: %bb.0, %bb.1
30     liveins: $x0
31     %0:gpr(s64) = COPY $x0
32     %1:gpr(s64) = G_CONSTANT i64 8589934592 ; Bit number 33 => TBNZX
33     %3:gpr(s64) = G_CONSTANT i64 0
34     %2:gpr(s64) = G_AND %0, %1
35     %5:gpr(s32) = G_ICMP intpred(ne), %2(s64), %3
36     G_BRCOND %5, %bb.1
37     G_BR %bb.0
38   bb.1:
39     RET_ReallyLR
41 ...
42 ---
43 name:            tbzx_and
44 alignment:       4
45 legalized:       true
46 regBankSelected: true
47 tracksRegLiveness: true
48 body:             |
49   ; CHECK-LABEL: name: tbzx_and
50   ; CHECK: bb.0:
51   ; CHECK-NEXT:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
52   ; CHECK-NEXT:   liveins: $x0
53   ; CHECK-NEXT: {{  $}}
54   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr64 = COPY $x0
55   ; CHECK-NEXT:   TBZX [[COPY]], 33, %bb.1
56   ; CHECK-NEXT:   B %bb.0
57   ; CHECK-NEXT: {{  $}}
58   ; CHECK-NEXT: bb.1:
59   ; CHECK-NEXT:   RET_ReallyLR
60   bb.0:
61     successors: %bb.0, %bb.1
62     liveins: $x0
63     %0:gpr(s64) = COPY $x0
64     %1:gpr(s64) = G_CONSTANT i64 8589934592 ; Bit number 33 => TBNZX
65     %3:gpr(s64) = G_CONSTANT i64 0
66     %2:gpr(s64) = G_AND %0, %1
67     %5:gpr(s32) = G_ICMP intpred(eq), %2(s64), %3
68     G_BRCOND %5, %bb.1
69     G_BR %bb.0
70   bb.1:
71     RET_ReallyLR
73 ...
74 ---
75 name:            tbnzw_and
76 alignment:       4
77 legalized:       true
78 regBankSelected: true
79 tracksRegLiveness: true
80 body:             |
81   ; CHECK-LABEL: name: tbnzw_and
82   ; CHECK: bb.0:
83   ; CHECK-NEXT:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
84   ; CHECK-NEXT:   liveins: $w0
85   ; CHECK-NEXT: {{  $}}
86   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr32 = COPY $w0
87   ; CHECK-NEXT:   TBNZW [[COPY]], 0, %bb.1
88   ; CHECK-NEXT:   B %bb.0
89   ; CHECK-NEXT: {{  $}}
90   ; CHECK-NEXT: bb.1:
91   ; CHECK-NEXT:   RET_ReallyLR
92   bb.0:
93     successors: %bb.0, %bb.1
94     liveins: $w0
95     %0:gpr(s32) = COPY $w0
96     %1:gpr(s32) = G_CONSTANT i32 1
97     %3:gpr(s32) = G_CONSTANT i32 0
98     %2:gpr(s32) = G_AND %0, %1
99     %5:gpr(s32) = G_ICMP intpred(ne), %2(s32), %3
100     G_BRCOND %5, %bb.1
101     G_BR %bb.0
102   bb.1:
103     RET_ReallyLR
107 name:            tbzw_and
108 alignment:       4
109 legalized:       true
110 regBankSelected: true
111 tracksRegLiveness: true
112 body:             |
113   ; CHECK-LABEL: name: tbzw_and
114   ; CHECK: bb.0:
115   ; CHECK-NEXT:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
116   ; CHECK-NEXT:   liveins: $w0
117   ; CHECK-NEXT: {{  $}}
118   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr32 = COPY $w0
119   ; CHECK-NEXT:   TBZW [[COPY]], 0, %bb.1
120   ; CHECK-NEXT:   B %bb.0
121   ; CHECK-NEXT: {{  $}}
122   ; CHECK-NEXT: bb.1:
123   ; CHECK-NEXT:   RET_ReallyLR
124   bb.0:
125     successors: %bb.0, %bb.1
126     liveins: $w0
127     %0:gpr(s32) = COPY $w0
128     %1:gpr(s32) = G_CONSTANT i32 1
129     %3:gpr(s32) = G_CONSTANT i32 0
130     %2:gpr(s32) = G_AND %0, %1
131     %5:gpr(s32) = G_ICMP intpred(eq), %2(s32), %3
132     G_BRCOND %5, %bb.1
133     G_BR %bb.0
134   bb.1:
135     RET_ReallyLR
139 name:            dont_fold_and_lt
140 alignment:       4
141 legalized:       true
142 regBankSelected: true
143 tracksRegLiveness: true
144 body:             |
145   ; CHECK-LABEL: name: dont_fold_and_lt
146   ; CHECK: bb.0:
147   ; CHECK-NEXT:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
148   ; CHECK-NEXT:   liveins: $w0
149   ; CHECK-NEXT: {{  $}}
150   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr32 = COPY $w0
151   ; CHECK-NEXT:   [[ANDSWri:%[0-9]+]]:gpr32 = ANDSWri [[COPY]], 0, implicit-def $nzcv
152   ; CHECK-NEXT:   Bcc 11, %bb.1, implicit $nzcv
153   ; CHECK-NEXT:   B %bb.0
154   ; CHECK-NEXT: {{  $}}
155   ; CHECK-NEXT: bb.1:
156   ; CHECK-NEXT:   RET_ReallyLR
157   bb.0:
158     successors: %bb.0, %bb.1
159     liveins: $w0
160     %0:gpr(s32) = COPY $w0
161     %1:gpr(s32) = G_CONSTANT i32 1
162     %3:gpr(s32) = G_CONSTANT i32 0
163     %2:gpr(s32) = G_AND %0, %1
164     %5:gpr(s32) = G_ICMP intpred(slt), %2(s32), %3
165     G_BRCOND %5, %bb.1
166     G_BR %bb.0
167   bb.1:
168     RET_ReallyLR
172 name:            dont_fold_and_gt
173 alignment:       4
174 legalized:       true
175 regBankSelected: true
176 tracksRegLiveness: true
177 body:             |
178   ; CHECK-LABEL: name: dont_fold_and_gt
179   ; CHECK: bb.0:
180   ; CHECK-NEXT:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
181   ; CHECK-NEXT:   liveins: $w0
182   ; CHECK-NEXT: {{  $}}
183   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr32 = COPY $w0
184   ; CHECK-NEXT:   [[ANDSWri:%[0-9]+]]:gpr32 = ANDSWri [[COPY]], 0, implicit-def $nzcv
185   ; CHECK-NEXT:   Bcc 12, %bb.1, implicit $nzcv
186   ; CHECK-NEXT:   B %bb.0
187   ; CHECK-NEXT: {{  $}}
188   ; CHECK-NEXT: bb.1:
189   ; CHECK-NEXT:   RET_ReallyLR
190   bb.0:
191     successors: %bb.0, %bb.1
192     liveins: $w0
193     %0:gpr(s32) = COPY $w0
194     %1:gpr(s32) = G_CONSTANT i32 1
195     %3:gpr(s32) = G_CONSTANT i32 0
196     %2:gpr(s32) = G_AND %0, %1
197     %5:gpr(s32) = G_ICMP intpred(sgt), %2(s32), %3
198     G_BRCOND %5, %bb.1
199     G_BR %bb.0
200   bb.1:
201     RET_ReallyLR
205 name:            dont_fold_and_not_power_of_2
206 alignment:       4
207 legalized:       true
208 regBankSelected: true
209 body:             |
210   ; CHECK-LABEL: name: dont_fold_and_not_power_of_2
211   ; CHECK: bb.0:
212   ; CHECK-NEXT:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
213   ; CHECK-NEXT:   liveins: $x0
214   ; CHECK-NEXT: {{  $}}
215   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr64 = COPY $x0
216   ; CHECK-NEXT:   [[ANDXri:%[0-9]+]]:gpr64common = ANDXri [[COPY]], 4098
217   ; CHECK-NEXT:   CBNZX [[ANDXri]], %bb.1
218   ; CHECK-NEXT:   B %bb.0
219   ; CHECK-NEXT: {{  $}}
220   ; CHECK-NEXT: bb.1:
221   ; CHECK-NEXT:   RET_ReallyLR
222   bb.0:
223     successors: %bb.0, %bb.1
224     liveins: $x0
225     %0:gpr(s64) = COPY $x0
226     %1:gpr(s64) = G_CONSTANT i64 7
227     %3:gpr(s64) = G_CONSTANT i64 0
228     %2:gpr(s64) = G_AND %0, %1
229     %5:gpr(s32) = G_ICMP intpred(ne), %2(s64), %3
230     G_BRCOND %5, %bb.1
231     G_BR %bb.0
232   bb.1:
233     RET_ReallyLR
237 name:            dont_fold_cmp_not_0
238 alignment:       4
239 legalized:       true
240 regBankSelected: true
241 body:             |
242   ; CHECK-LABEL: name: dont_fold_cmp_not_0
243   ; CHECK: bb.0:
244   ; CHECK-NEXT:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
245   ; CHECK-NEXT:   liveins: $x0
246   ; CHECK-NEXT: {{  $}}
247   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr64 = COPY $x0
248   ; CHECK-NEXT:   [[ANDXri:%[0-9]+]]:gpr64sp = ANDXri [[COPY]], 8064
249   ; CHECK-NEXT:   [[SUBSXri:%[0-9]+]]:gpr64 = SUBSXri [[ANDXri]], 4, 0, implicit-def $nzcv
250   ; CHECK-NEXT:   Bcc 1, %bb.1, implicit $nzcv
251   ; CHECK-NEXT:   B %bb.0
252   ; CHECK-NEXT: {{  $}}
253   ; CHECK-NEXT: bb.1:
254   ; CHECK-NEXT:   RET_ReallyLR
255   bb.0:
256     successors: %bb.0, %bb.1
257     liveins: $x0
258     %0:gpr(s64) = COPY $x0
259     %1:gpr(s64) = G_CONSTANT i64 4
260     %3:gpr(s64) = G_CONSTANT i64 4
261     %2:gpr(s64) = G_AND %0, %1
262     %5:gpr(s32) = G_ICMP intpred(ne), %2(s64), %3
263     G_BRCOND %5, %bb.1
264     G_BR %bb.0
265   bb.1:
266     RET_ReallyLR