[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / form-bitfield-extract-from-shr-and.mir
blobc8c5b157f4244fe96596f2ab4e49dee4c7c25b35
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple aarch64 -run-pass=aarch64-postlegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s
4 # Check that we can fold a G_ASHR/G_LSHR fed by a G_AND into a G_SBFX/G_UBFX.
6 ---
7 name:            mask_extract_unsigned_32
8 legalized: true
9 body:             |
10   bb.0.entry:
11     ; CHECK-LABEL: name: mask_extract_unsigned_32
12     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
13     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 2
14     ; CHECK-NEXT: [[UBFX:%[0-9]+]]:_(s32) = G_UBFX [[COPY]], [[C]](s32), [[C]]
15     ; CHECK-NEXT: $w0 = COPY [[UBFX]](s32)
16     %0:_(s32) = COPY $w0
17     %1:_(s32) = G_CONSTANT i32 12
18     %2:_(s32) = G_CONSTANT i32 2
19     %3:_(s32) = G_AND %0, %1
20     %4:_(s32) = G_LSHR %3, %2
21     $w0 = COPY %4(s32)
22 ...
23 ---
24 name:            mask_extract_unsigned_64
25 legalized: true
26 body:             |
27   bb.0.entry:
28     ; CHECK-LABEL: name: mask_extract_unsigned_64
29     ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
30     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 56
31     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 4
32     ; CHECK-NEXT: [[UBFX:%[0-9]+]]:_(s64) = G_UBFX [[COPY]], [[C]](s64), [[C1]]
33     ; CHECK-NEXT: $x0 = COPY [[UBFX]](s64)
34     %0:_(s64) = COPY $x0
35     %1:_(s64) = G_CONSTANT i64 1080863910568919040
36     %2:_(s64) = G_CONSTANT i64 56
37     %3:_(s64) = G_AND %0, %1
38     %4:_(s64) = G_LSHR %3, %2
39     $x0 = COPY %4(s64)
40 ...
41 ---
42 name:            no_mask_extract_unsigned_128
43 legalized: true
44 body:             |
45   bb.0.entry:
46     ; CHECK-LABEL: name: no_mask_extract_unsigned_128
47     ; CHECK: [[COPY:%[0-9]+]]:_(s128) = COPY $q0
48     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s128) = G_CONSTANT i128 1080863910568919040
49     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s128) = G_CONSTANT i128 56
50     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s128) = G_AND [[COPY]], [[C]]
51     ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s128) = G_LSHR [[AND]], [[C1]](s128)
52     ; CHECK-NEXT: $q0 = COPY [[LSHR]](s128)
53     %0:_(s128) = COPY $q0
54     %1:_(s128) = G_CONSTANT i128 1080863910568919040
55     %2:_(s128) = G_CONSTANT i128 56
56     %3:_(s128) = G_AND %0, %1
57     %4:_(s128) = G_LSHR %3, %2
58     $q0 = COPY %4(s128)
59 ...
60 ---
61 name:            mask_extract_asr
62 legalized: true
63 body:             |
64   bb.0.entry:
65     ; CHECK-LABEL: name: mask_extract_asr
66     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
67     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 29
68     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 2
69     ; CHECK-NEXT: [[UBFX:%[0-9]+]]:_(s32) = G_UBFX [[COPY]], [[C]](s32), [[C1]]
70     ; CHECK-NEXT: $w0 = COPY [[UBFX]](s32)
71     %0:_(s32) = COPY $w0
72     %1:_(s32) = G_CONSTANT i32 1610612736
73     %2:_(s32) = G_CONSTANT i32 29
74     %3:_(s32) = G_AND %0, %1
75     %4:_(s32) = G_ASHR %3, %2
76     $w0 = COPY %4(s32)
77 ...
78 ---
79 name:            no_mask_extract_asr
80 legalized: true
81 body:             |
82   bb.0.entry:
83     ; CHECK-LABEL: name: no_mask_extract_asr
84     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
85     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1073741824
86     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 30
87     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]]
88     ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[AND]], [[C1]](s32)
89     ; CHECK-NEXT: $w0 = COPY [[ASHR]](s32)
90     %0:_(s32) = COPY $w0
91     %1:_(s32) = G_CONSTANT i32 3221225472
92     %2:_(s32) = G_CONSTANT i32 30
93     %3:_(s32) = G_AND %0, %1
94     %4:_(s32) = G_ASHR %3, %2
95     $w0 = COPY %4(s32)
96 ...
97 ---
98 name:            mask_extract_signed_nonneg
99 legalized: true
100 body:             |
101   bb.0.entry:
102     ; CHECK-LABEL: name: mask_extract_signed_nonneg
103     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
104     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 29
105     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 2
106     ; CHECK-NEXT: [[UBFX:%[0-9]+]]:_(s32) = G_UBFX [[COPY]], [[C]](s32), [[C1]]
107     ; CHECK-NEXT: $w0 = COPY [[UBFX]](s32)
108     %0:_(s32) = COPY $w0
109     %1:_(s32) = G_CONSTANT i32 2147483647
110     %2:_(s32) = G_CONSTANT i32 29
111     %3:_(s32) = G_AND %0, %1
112     %4:_(s32) = G_ASHR %3, %2
113     $w0 = COPY %4(s32)
116 name:            no_mask_extract_large_shift
117 legalized: true
118 body:             |
119   bb.0.entry:
120     ; CHECK-LABEL: name: no_mask_extract_large_shift
121     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
122     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 12
123     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 33
124     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]]
125     ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[AND]], [[C1]](s32)
126     ; CHECK-NEXT: $w0 = COPY [[LSHR]](s32)
127     %0:_(s32) = COPY $w0
128     %1:_(s32) = G_CONSTANT i32 12
129     %2:_(s32) = G_CONSTANT i32 33
130     %3:_(s32) = G_AND %0, %1
131     %4:_(s32) = G_LSHR %3, %2
132     $w0 = COPY %4(s32)
135 name:            no_mask_extract_negative_shift
136 legalized: true
137 body:             |
138   bb.0.entry:
139     ; CHECK-LABEL: name: no_mask_extract_negative_shift
140     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
141     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 12
142     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1
143     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]]
144     ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[AND]], [[C1]](s32)
145     ; CHECK-NEXT: $w0 = COPY [[LSHR]](s32)
146     %0:_(s32) = COPY $w0
147     %1:_(s32) = G_CONSTANT i32 12
148     %2:_(s32) = G_CONSTANT i32 -1
149     %3:_(s32) = G_AND %0, %1
150     %4:_(s32) = G_LSHR %3, %2
151     $w0 = COPY %4(s32)
154 name:            no_mask_extract_disjoint
155 legalized: true
156 body:             |
157   bb.0.entry:
158     ; CHECK-LABEL: name: no_mask_extract_disjoint
159     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
160     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 26
161     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
162     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]]
163     ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[AND]], [[C1]](s32)
164     ; CHECK-NEXT: $w0 = COPY [[LSHR]](s32)
165     %0:_(s32) = COPY $w0
166     %1:_(s32) = G_CONSTANT i32 26
167     %2:_(s32) = G_CONSTANT i32 1
168     %3:_(s32) = G_AND %0, %1
169     %4:_(s32) = G_LSHR %3, %2
170     $w0 = COPY %4(s32)
173 name:           no_mask_extract_extra_bits
174 legalized: true
175 body:             |
176   bb.0.entry:
177     ; CHECK-LABEL: name: no_mask_extract_extra_bits
178     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
179     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 25
180     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 2
181     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]]
182     ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[AND]], [[C1]](s32)
183     ; CHECK-NEXT: $w0 = COPY [[LSHR]](s32)
184     %0:_(s32) = COPY $w0
185     %1:_(s32) = G_CONSTANT i32 25
186     %2:_(s32) = G_CONSTANT i32 2
187     %3:_(s32) = G_AND %0, %1
188     %4:_(s32) = G_LSHR %3, %2
189     $w0 = COPY %4(s32)
192 name:          zero_from_large_shift
193 legalized: true
194 body:              |
195   bb.1.entry:
196     ; CHECK-LABEL: name: zero_from_large_shift
197     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
198     ; CHECK-NEXT: $x0 = COPY [[C]](s64)
199     %2:_(s32) = COPY $w0
200     %1:_(s8) = G_TRUNC %2:_(s32)
201     %3:_(s8) = G_ASSERT_ZEXT %1:_, 1
202     %5:_(s64) = G_CONSTANT i64 1
203     %7:_(s64) = G_ANYEXT %3:_(s8)
204     %4:_(s64) = G_AND %7:_, %5:_
205     %6:_(s64) = G_LSHR %4:_, %5:_(s64)
206     $x0 = COPY %6:_(s64)