[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / postlegalizer-combiner-split-zero-stores.mir
blobba0d81474afd0c1de9b7d3bfceeb259460837cb7
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 ...
5 ---
6 name:            v2s64_split
7 legalized:       true
8 tracksRegLiveness: true
9 body:             |
10   bb.1.entry:
11     liveins: $x0
13     ; Split a store of <2 x i64> into two scalar stores.
15     ; CHECK-LABEL: name: v2s64_split
16     ; CHECK: liveins: $x0
17     ; CHECK-NEXT: {{  $}}
18     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
19     ; CHECK-NEXT: %zero:_(s64) = G_CONSTANT i64 0
20     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 8
21     ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s64)
22     ; CHECK-NEXT: G_STORE %zero(s64), [[COPY]](p0) :: (store (s64), align 16)
23     ; CHECK-NEXT: G_STORE %zero(s64), [[PTR_ADD]](p0) :: (store (s64) into unknown-address + 8)
24     ; CHECK-NEXT: RET_ReallyLR
25     %0:_(p0) = COPY $x0
26     %zero:_(s64) = G_CONSTANT i64 0
27     %zerovec:_(<2 x s64>) = G_BUILD_VECTOR %zero, %zero
28     G_STORE %zerovec(<2 x s64>), %0(p0) :: (store (<2 x s64>))
29     RET_ReallyLR
31 ...
32 ---
33 name:            v4i32_split
34 legalized:       true
35 tracksRegLiveness: true
36 body:             |
37   bb.1.entry:
38     liveins: $x0
40     ; CHECK-LABEL: name: v4i32_split
41     ; CHECK: liveins: $x0
42     ; CHECK-NEXT: {{  $}}
43     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
44     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
45     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 8
46     ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C1]](s64)
47     ; CHECK-NEXT: G_STORE [[C]](s64), [[COPY]](p0) :: (store (s64), align 16)
48     ; CHECK-NEXT: G_STORE [[C]](s64), [[PTR_ADD]](p0) :: (store (s64) into unknown-address + 8)
49     ; CHECK-NEXT: RET_ReallyLR
50     %0:_(p0) = COPY $x0
51     %zero:_(s32) = G_CONSTANT i32 0
52     %zerovec:_(<4 x s32>) = G_BUILD_VECTOR %zero, %zero, %zero, %zero
53     G_STORE %zerovec(<4 x s32>), %0(p0) :: (store (<4 x s32>))
54     RET_ReallyLR
56 ...
57 ---
58 name:            v8i16_split
59 legalized:       true
60 tracksRegLiveness: true
61 body:             |
62   bb.1.entry:
63     liveins: $x0
65     ; CHECK-LABEL: name: v8i16_split
66     ; CHECK: liveins: $x0
67     ; CHECK-NEXT: {{  $}}
68     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
69     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
70     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 8
71     ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C1]](s64)
72     ; CHECK-NEXT: G_STORE [[C]](s64), [[COPY]](p0) :: (store (s64), align 16)
73     ; CHECK-NEXT: G_STORE [[C]](s64), [[PTR_ADD]](p0) :: (store (s64) into unknown-address + 8)
74     ; CHECK-NEXT: RET_ReallyLR
75     %0:_(p0) = COPY $x0
76     %zero:_(s16) = G_CONSTANT i16 0
77     %zerovec:_(<8 x s16>) = G_BUILD_VECTOR %zero, %zero, %zero, %zero, %zero, %zero, %zero, %zero
78     G_STORE %zerovec(<8 x s16>), %0(p0) :: (store (<8 x s16>))
79     RET_ReallyLR
81 ...
83 # Negative tests
84 ---
85 name:            v2i32_nosplit
86 legalized:       true
87 tracksRegLiveness: true
88 body:             |
89   bb.1.entry:
90     liveins: $x0
92     ; CHECK-LABEL: name: v2i32_nosplit
93     ; CHECK: liveins: $x0
94     ; CHECK-NEXT: {{  $}}
95     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
96     ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
97     ; CHECK-NEXT: %zerovec:_(<2 x s32>) = G_BUILD_VECTOR %zero(s32), %zero(s32)
98     ; CHECK-NEXT: G_STORE %zerovec(<2 x s32>), [[COPY]](p0) :: (store (<2 x s32>))
99     ; CHECK-NEXT: RET_ReallyLR
100     %0:_(p0) = COPY $x0
101     %zero:_(s32) = G_CONSTANT i32 0
102     %zerovec:_(<2 x s32>) = G_BUILD_VECTOR %zero, %zero
103     G_STORE %zerovec(<2 x s32>), %0(p0) :: (store (<2 x s32>))
104     RET_ReallyLR
108 name:            multiple_uses
109 legalized:       true
110 tracksRegLiveness: true
111 body:             |
112   bb.1.entry:
113     liveins: $x0
115     ; CHECK-LABEL: name: multiple_uses
116     ; CHECK: liveins: $x0
117     ; CHECK-NEXT: {{  $}}
118     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
119     ; CHECK-NEXT: %zero:_(s64) = G_CONSTANT i64 0
120     ; CHECK-NEXT: %zerovec:_(<2 x s64>) = G_BUILD_VECTOR %zero(s64), %zero(s64)
121     ; CHECK-NEXT: G_STORE %zerovec(<2 x s64>), [[COPY]](p0) :: (store (<2 x s64>))
122     ; CHECK-NEXT: $q0 = COPY %zerovec(<2 x s64>)
123     ; CHECK-NEXT: RET_ReallyLR
124     %0:_(p0) = COPY $x0
125     %zero:_(s64) = G_CONSTANT i64 0
126     %zerovec:_(<2 x s64>) = G_BUILD_VECTOR %zero, %zero
127     G_STORE %zerovec(<2 x s64>), %0(p0) :: (store (<2 x s64>))
128     $q0 = COPY %zerovec
129     RET_ReallyLR
133 name:            truncating
134 legalized:       true
135 tracksRegLiveness: true
136 body:             |
137   bb.1.entry:
138     liveins: $x0
140     ; CHECK-LABEL: name: truncating
141     ; CHECK: liveins: $x0
142     ; CHECK-NEXT: {{  $}}
143     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
144     ; CHECK-NEXT: %zero:_(s64) = G_CONSTANT i64 0
145     ; CHECK-NEXT: %zerovec:_(<2 x s64>) = G_BUILD_VECTOR %zero(s64), %zero(s64)
146     ; CHECK-NEXT: G_STORE %zerovec(<2 x s64>), [[COPY]](p0) :: (store (<2 x s32>))
147     ; CHECK-NEXT: RET_ReallyLR
148     %0:_(p0) = COPY $x0
149     %zero:_(s64) = G_CONSTANT i64 0
150     %zerovec:_(<2 x s64>) = G_BUILD_VECTOR %zero, %zero
151     G_STORE %zerovec(<2 x s64>), %0(p0) :: (store (<2 x s32>))
152     RET_ReallyLR
156 name:            volatile
157 legalized:       true
158 tracksRegLiveness: true
159 body:             |
160   bb.1.entry:
161     liveins: $x0
163     ; CHECK-LABEL: name: volatile
164     ; CHECK: liveins: $x0
165     ; CHECK-NEXT: {{  $}}
166     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
167     ; CHECK-NEXT: %zero:_(s64) = G_CONSTANT i64 0
168     ; CHECK-NEXT: %zerovec:_(<2 x s64>) = G_BUILD_VECTOR %zero(s64), %zero(s64)
169     ; CHECK-NEXT: G_STORE %zerovec(<2 x s64>), [[COPY]](p0) :: (volatile store (<2 x s64>))
170     ; CHECK-NEXT: RET_ReallyLR
171     %0:_(p0) = COPY $x0
172     %zero:_(s64) = G_CONSTANT i64 0
173     %zerovec:_(<2 x s64>) = G_BUILD_VECTOR %zero, %zero
174     G_STORE %zerovec(<2 x s64>), %0(p0) :: (volatile store (<2 x s64>))
175     RET_ReallyLR
179 name:            s128_scalar
180 legalized:       true
181 tracksRegLiveness: true
182 body:             |
183   bb.1.entry:
184     liveins: $x0
186     ; Split a store of <2 x i64> into two scalar stores.
188     ; CHECK-LABEL: name: s128_scalar
189     ; CHECK: liveins: $x0
190     ; CHECK-NEXT: {{  $}}
191     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
192     ; CHECK-NEXT: %zero:_(s128) = G_CONSTANT i128 0
193     ; CHECK-NEXT: G_STORE %zero(s128), [[COPY]](p0) :: (store (s128))
194     ; CHECK-NEXT: RET_ReallyLR
195     %0:_(p0) = COPY $x0
196     %zero:_(s128) = G_CONSTANT i128 0
197     G_STORE %zero(s128), %0(p0) :: (store (s128))
198     RET_ReallyLR