[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / select-brcond-of-binop.mir
blob4cf3c5769dda7c37c3e6fe3ab6aec2d4477b4cd6
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=aarch64-- -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
3 ---
4 name:            condbr_of_not
5 legalized:       true
6 regBankSelected: true
7 liveins:
8   - { reg: '$x0' }
9 body:             |
10   ; CHECK-LABEL: name: condbr_of_not
11   ; CHECK: bb.0:
12   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
13   ; CHECK-NEXT:   liveins: $x0
14   ; CHECK-NEXT: {{  $}}
15   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
16   ; CHECK-NEXT:   [[LDRBBui:%[0-9]+]]:gpr32 = LDRBBui [[COPY]], 0 :: (load (s8))
17   ; CHECK-NEXT:   TBZW [[LDRBBui]], 0, %bb.2
18   ; CHECK-NEXT: {{  $}}
19   ; CHECK-NEXT: bb.1:
20   ; CHECK-NEXT:   RET_ReallyLR
21   ; CHECK-NEXT: {{  $}}
22   ; CHECK-NEXT: bb.2:
23   ; CHECK-NEXT:   RET_ReallyLR
24   bb.1:
25     successors: %bb.2, %bb.3
26     liveins: $x0
28     %0:gpr(p0) = COPY $x0
29     %8:gpr(s8) = G_LOAD %0(p0) :: (load (s8))
30     %4:gpr(s32) = G_ANYEXT %8(s8)
31     %5:gpr(s32) = G_CONSTANT i32 1
32     %6:gpr(s32) = G_XOR %4, %5
33     G_BRCOND %6, %bb.3
35   bb.2:
36     RET_ReallyLR
38   bb.3:
39     RET_ReallyLR
41 ...
42 ---
43 name:            condbr_of_not_64
44 legalized:       true
45 regBankSelected: true
46 liveins:
47   - { reg: '$x0' }
48 body:             |
49   ; CHECK-LABEL: name: condbr_of_not_64
50   ; CHECK: bb.0:
51   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
52   ; CHECK-NEXT:   liveins: $x0
53   ; CHECK-NEXT: {{  $}}
54   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
55   ; CHECK-NEXT:   [[LDRBBui:%[0-9]+]]:gpr32 = LDRBBui [[COPY]], 0 :: (load (s8))
56   ; CHECK-NEXT:   TBZW [[LDRBBui]], 0, %bb.2
57   ; CHECK-NEXT: {{  $}}
58   ; CHECK-NEXT: bb.1:
59   ; CHECK-NEXT:   RET_ReallyLR
60   ; CHECK-NEXT: {{  $}}
61   ; CHECK-NEXT: bb.2:
62   ; CHECK-NEXT:   RET_ReallyLR
63   ; TB(N)ZX has no encoding if the bit being tested is < 32, so we should get
64   ; TBZW here.
65   ;
66   bb.1:
67     successors: %bb.2, %bb.3
68     liveins: $x0
70     %0:gpr(p0) = COPY $x0
71     %8:gpr(s8) = G_LOAD %0(p0) :: (load (s8))
72     %4:gpr(s64) = G_ANYEXT %8(s8)
73     %5:gpr(s64) = G_CONSTANT i64 1
74     %6:gpr(s64) = G_XOR %4, %5
75     %3:gpr(s32) = G_TRUNC %6(s64)
76     G_BRCOND %3(s32), %bb.3
78   bb.2:
79     RET_ReallyLR
81   bb.3:
82     RET_ReallyLR
84 ...
85 ---
86 name:            condbr_of_and
87 legalized:       true
88 regBankSelected: true
89 body:             |
90   ; CHECK-LABEL: name: condbr_of_and
91   ; CHECK: bb.0:
92   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
93   ; CHECK-NEXT:   liveins: $w0
94   ; CHECK-NEXT: {{  $}}
95   ; CHECK-NEXT:   %lhs:gpr32 = COPY $w0
96   ; CHECK-NEXT:   TBNZW %lhs, 0, %bb.2
97   ; CHECK-NEXT: {{  $}}
98   ; CHECK-NEXT: bb.1:
99   ; CHECK-NEXT:   RET_ReallyLR
100   ; CHECK-NEXT: {{  $}}
101   ; CHECK-NEXT: bb.2:
102   ; CHECK-NEXT:   RET_ReallyLR
103   bb.1:
104     successors: %bb.2, %bb.3
105     liveins: $w0
106     %lhs:gpr(s32) = COPY $w0
107     %rhs:gpr(s32) = G_CONSTANT i32 1
108     %op:gpr(s32) = G_AND %lhs, %rhs
109     G_BRCOND %op, %bb.3
111   bb.2:
112     RET_ReallyLR
114   bb.3:
115     RET_ReallyLR
119 name:            condbr_of_and_no_cst
120 legalized:       true
121 regBankSelected: true
122 body:             |
123   ; CHECK-LABEL: name: condbr_of_and_no_cst
124   ; CHECK: bb.0:
125   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
126   ; CHECK-NEXT:   liveins: $w0, $w1
127   ; CHECK-NEXT: {{  $}}
128   ; CHECK-NEXT:   %lhs:gpr32 = COPY $w0
129   ; CHECK-NEXT:   %rhs:gpr32 = COPY $w1
130   ; CHECK-NEXT:   %op:gpr32 = ANDWrr %lhs, %rhs
131   ; CHECK-NEXT:   TBNZW %op, 0, %bb.2
132   ; CHECK-NEXT: {{  $}}
133   ; CHECK-NEXT: bb.1:
134   ; CHECK-NEXT:   RET_ReallyLR
135   ; CHECK-NEXT: {{  $}}
136   ; CHECK-NEXT: bb.2:
137   ; CHECK-NEXT:   RET_ReallyLR
138   bb.1:
139     successors: %bb.2, %bb.3
140     liveins: $w0, $w1
141     %lhs:gpr(s32) = COPY $w0
142     %rhs:gpr(s32) = COPY $w1
143     %op:gpr(s32) = G_AND %lhs, %rhs
144     G_BRCOND %op, %bb.3
146   bb.2:
147     RET_ReallyLR
149   bb.3:
150     RET_ReallyLR
154 name:            condbr_of_shl
155 legalized:       true
156 regBankSelected: true
157 body:             |
158   ; CHECK-LABEL: name: condbr_of_shl
159   ; CHECK: bb.0:
160   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
161   ; CHECK-NEXT:   liveins: $w0
162   ; CHECK-NEXT: {{  $}}
163   ; CHECK-NEXT:   %lhs:gpr32 = COPY $w0
164   ; CHECK-NEXT:   %op:gpr32 = UBFMWri %lhs, 31, 30
165   ; CHECK-NEXT:   TBNZW %op, 0, %bb.2
166   ; CHECK-NEXT: {{  $}}
167   ; CHECK-NEXT: bb.1:
168   ; CHECK-NEXT:   RET_ReallyLR
169   ; CHECK-NEXT: {{  $}}
170   ; CHECK-NEXT: bb.2:
171   ; CHECK-NEXT:   RET_ReallyLR
172   ; We won't ever fold this, because
173   ; bit = 0
174   ; bit - constant < 0, which isn't valid for tbz/tbnz.
175   ;
176   bb.1:
177     successors: %bb.2, %bb.3
178     liveins: $w0
179     %lhs:gpr(s32) = COPY $w0
180     %rhs:gpr(s32) = G_CONSTANT i32 1
181     %op:gpr(s32) = G_SHL %lhs, %rhs
182     G_BRCOND %op, %bb.3
184   bb.2:
185     RET_ReallyLR
187   bb.3:
188     RET_ReallyLR
192 name:            condbr_of_ashr
193 legalized:       true
194 regBankSelected: true
195 body:             |
196   ; CHECK-LABEL: name: condbr_of_ashr
197   ; CHECK: bb.0:
198   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
199   ; CHECK-NEXT:   liveins: $w0
200   ; CHECK-NEXT: {{  $}}
201   ; CHECK-NEXT:   %lhs:gpr32 = COPY $w0
202   ; CHECK-NEXT:   TBNZW %lhs, 1, %bb.2
203   ; CHECK-NEXT: {{  $}}
204   ; CHECK-NEXT: bb.1:
205   ; CHECK-NEXT:   RET_ReallyLR
206   ; CHECK-NEXT: {{  $}}
207   ; CHECK-NEXT: bb.2:
208   ; CHECK-NEXT:   RET_ReallyLR
209   ; We can fold ashr, because we can have
210   ;
211   ; (tbz (ashr x, c), 0) where 0 + c > # bits in x.
212   ;
213   bb.1:
214     successors: %bb.2, %bb.3
215     liveins: $w0
216     %lhs:gpr(s32) = COPY $w0
217     %rhs:gpr(s32) = G_CONSTANT i32 1
218     %op:gpr(s32) = G_ASHR %lhs, %rhs
219     G_BRCOND %op, %bb.3
221   bb.2:
222     RET_ReallyLR
224   bb.3:
225     RET_ReallyLR
229 name:            tbnzx
230 legalized:       true
231 regBankSelected: true
232 body:             |
233   ; CHECK-LABEL: name: tbnzx
234   ; CHECK: bb.0:
235   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
236   ; CHECK-NEXT:   liveins: $x0
237   ; CHECK-NEXT: {{  $}}
238   ; CHECK-NEXT:   %lhs:gpr64 = COPY $x0
239   ; CHECK-NEXT:   TBNZX %lhs, 63, %bb.2
240   ; CHECK-NEXT: {{  $}}
241   ; CHECK-NEXT: bb.1:
242   ; CHECK-NEXT:   RET_ReallyLR
243   ; CHECK-NEXT: {{  $}}
244   ; CHECK-NEXT: bb.2:
245   ; CHECK-NEXT:   RET_ReallyLR
246   bb.1:
247     successors: %bb.2, %bb.3
248     liveins: $x0
249     %lhs:gpr(s64) = COPY $x0
250     %rhs:gpr(s64) = G_CONSTANT i64 8589934592
251     %op:gpr(s64) = G_ASHR %lhs, %rhs
252     %trunc:gpr(s32) = G_TRUNC %op(s64)
253     G_BRCOND %trunc, %bb.3
254   bb.2:
255     RET_ReallyLR
256   bb.3:
257     RET_ReallyLR