1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx908 -run-pass=si-fold-operands -verify-machineinstrs -o - %s | FileCheck --check-prefix=GFX908 %s 3# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a -run-pass=si-fold-operands -verify-machineinstrs -o - %s | FileCheck --check-prefix=GFX90A %s 4 5# Should fold all copies for gfx908. In case of gfx90a, the folding must happen only for the aligned cases. 6 7--- 8name: aligned_vgpr_64 9tracksRegLiveness: true 10body: | 11 bb.0: 12 liveins: $vgpr0_vgpr1 13 ; GFX908-LABEL: name: aligned_vgpr_64 14 ; GFX908: liveins: $vgpr0_vgpr1 15 ; GFX908-NEXT: {{ $}} 16 ; GFX908-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 17 ; GFX908-NEXT: [[DEF:%[0-9]+]]:vreg_64_align2 = IMPLICIT_DEF 18 ; GFX908-NEXT: GLOBAL_STORE_DWORDX2 [[COPY]], [[DEF]], 0, 0, implicit $exec 19 ; 20 ; GFX90A-LABEL: name: aligned_vgpr_64 21 ; GFX90A: liveins: $vgpr0_vgpr1 22 ; GFX90A-NEXT: {{ $}} 23 ; GFX90A-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 24 ; GFX90A-NEXT: [[DEF:%[0-9]+]]:vreg_64_align2 = IMPLICIT_DEF 25 ; GFX90A-NEXT: GLOBAL_STORE_DWORDX2 [[COPY]], [[DEF]], 0, 0, implicit $exec 26 %0:vreg_64_align2 = COPY $vgpr0_vgpr1 27 %1:vreg_64_align2 = IMPLICIT_DEF 28 %2:vreg_64_align2 = COPY killed %1 29 GLOBAL_STORE_DWORDX2 %0, %2, 0, 0, implicit $exec 30... 31 32--- 33name: unaligned_vgpr_64 34tracksRegLiveness: true 35body: | 36 bb.0: 37 liveins: $vgpr0_vgpr1 38 ; GFX908-LABEL: name: unaligned_vgpr_64 39 ; GFX908: liveins: $vgpr0_vgpr1 40 ; GFX908-NEXT: {{ $}} 41 ; GFX908-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 42 ; GFX908-NEXT: [[DEF:%[0-9]+]]:vreg_64 = IMPLICIT_DEF 43 ; GFX908-NEXT: GLOBAL_STORE_DWORDX2 [[COPY]], [[DEF]], 0, 0, implicit $exec 44 ; 45 ; GFX90A-LABEL: name: unaligned_vgpr_64 46 ; GFX90A: liveins: $vgpr0_vgpr1 47 ; GFX90A-NEXT: {{ $}} 48 ; GFX90A-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 49 ; GFX90A-NEXT: [[DEF:%[0-9]+]]:vreg_64 = IMPLICIT_DEF 50 ; GFX90A-NEXT: [[COPY1:%[0-9]+]]:vreg_64_align2 = COPY killed [[DEF]] 51 ; GFX90A-NEXT: GLOBAL_STORE_DWORDX2 [[COPY]], [[COPY1]], 0, 0, implicit $exec 52 %0:vreg_64_align2 = COPY $vgpr0_vgpr1 53 %1:vreg_64 = IMPLICIT_DEF 54 %2:vreg_64_align2 = COPY killed %1 55 GLOBAL_STORE_DWORDX2 %0, %2, 0, 0, implicit $exec 56... 57 58--- 59name: aligned_vgpr_96_sub0_subg1 60tracksRegLiveness: true 61body: | 62 bb.0: 63 liveins: $vgpr0_vgpr1 64 ; GFX908-LABEL: name: aligned_vgpr_96_sub0_subg1 65 ; GFX908: liveins: $vgpr0_vgpr1 66 ; GFX908-NEXT: {{ $}} 67 ; GFX908-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 68 ; GFX908-NEXT: [[DEF:%[0-9]+]]:vreg_96_align2 = IMPLICIT_DEF 69 ; GFX908-NEXT: GLOBAL_STORE_DWORDX2 [[COPY]], [[DEF]].sub0_sub1, 0, 0, implicit $exec 70 ; 71 ; GFX90A-LABEL: name: aligned_vgpr_96_sub0_subg1 72 ; GFX90A: liveins: $vgpr0_vgpr1 73 ; GFX90A-NEXT: {{ $}} 74 ; GFX90A-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 75 ; GFX90A-NEXT: [[DEF:%[0-9]+]]:vreg_96_align2 = IMPLICIT_DEF 76 ; GFX90A-NEXT: GLOBAL_STORE_DWORDX2 [[COPY]], [[DEF]].sub0_sub1, 0, 0, implicit $exec 77 %0:vreg_64_align2 = COPY $vgpr0_vgpr1 78 %1:vreg_96_align2 = IMPLICIT_DEF 79 %2:vreg_64_align2 = COPY killed %1.sub0_sub1:vreg_96_align2 80 GLOBAL_STORE_DWORDX2 %0, %2, 0, 0, implicit $exec 81... 82 83--- 84name: unaligned_vgpr_96_sub1_sub2 85tracksRegLiveness: true 86body: | 87 bb.0: 88 liveins: $vgpr0_vgpr1 89 ; GFX908-LABEL: name: unaligned_vgpr_96_sub1_sub2 90 ; GFX908: liveins: $vgpr0_vgpr1 91 ; GFX908-NEXT: {{ $}} 92 ; GFX908-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 93 ; GFX908-NEXT: [[DEF:%[0-9]+]]:vreg_96_align2 = IMPLICIT_DEF 94 ; GFX908-NEXT: GLOBAL_STORE_DWORDX2 [[COPY]], [[DEF]].sub1_sub2, 0, 0, implicit $exec 95 ; 96 ; GFX90A-LABEL: name: unaligned_vgpr_96_sub1_sub2 97 ; GFX90A: liveins: $vgpr0_vgpr1 98 ; GFX90A-NEXT: {{ $}} 99 ; GFX90A-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 100 ; GFX90A-NEXT: [[DEF:%[0-9]+]]:vreg_96_align2 = IMPLICIT_DEF 101 ; GFX90A-NEXT: [[COPY1:%[0-9]+]]:vreg_64_align2 = COPY killed [[DEF]].sub1_sub2 102 ; GFX90A-NEXT: GLOBAL_STORE_DWORDX2 [[COPY]], [[COPY1]], 0, 0, implicit $exec 103 %0:vreg_64_align2 = COPY $vgpr0_vgpr1 104 %1:vreg_96_align2 = IMPLICIT_DEF 105 %2:vreg_64_align2 = COPY killed %1.sub1_sub2:vreg_96_align2 106 GLOBAL_STORE_DWORDX2 %0, %2, 0, 0, implicit $exec 107... 108 109--- 110name: aligned_vgpr_96 111tracksRegLiveness: true 112body: | 113 bb.0: 114 liveins: $vgpr0_vgpr1 115 ; GFX908-LABEL: name: aligned_vgpr_96 116 ; GFX908: liveins: $vgpr0_vgpr1 117 ; GFX908-NEXT: {{ $}} 118 ; GFX908-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 119 ; GFX908-NEXT: [[DEF:%[0-9]+]]:vreg_96_align2 = IMPLICIT_DEF 120 ; GFX908-NEXT: GLOBAL_STORE_DWORDX3 [[COPY]], [[DEF]], 0, 0, implicit $exec 121 ; 122 ; GFX90A-LABEL: name: aligned_vgpr_96 123 ; GFX90A: liveins: $vgpr0_vgpr1 124 ; GFX90A-NEXT: {{ $}} 125 ; GFX90A-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 126 ; GFX90A-NEXT: [[DEF:%[0-9]+]]:vreg_96_align2 = IMPLICIT_DEF 127 ; GFX90A-NEXT: GLOBAL_STORE_DWORDX3 [[COPY]], [[DEF]], 0, 0, implicit $exec 128 %0:vreg_64_align2 = COPY $vgpr0_vgpr1 129 %1:vreg_96_align2 = IMPLICIT_DEF 130 %2:vreg_96_align2 = COPY killed %1 131 GLOBAL_STORE_DWORDX3 %0, %2, 0, 0, implicit $exec 132... 133 134--- 135name: unaligned_vgpr_96 136tracksRegLiveness: true 137body: | 138 bb.0: 139 liveins: $vgpr0_vgpr1 140 ; GFX908-LABEL: name: unaligned_vgpr_96 141 ; GFX908: liveins: $vgpr0_vgpr1 142 ; GFX908-NEXT: {{ $}} 143 ; GFX908-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 144 ; GFX908-NEXT: [[DEF:%[0-9]+]]:vreg_96 = IMPLICIT_DEF 145 ; GFX908-NEXT: GLOBAL_STORE_DWORDX3 [[COPY]], [[DEF]], 0, 0, implicit $exec 146 ; 147 ; GFX90A-LABEL: name: unaligned_vgpr_96 148 ; GFX90A: liveins: $vgpr0_vgpr1 149 ; GFX90A-NEXT: {{ $}} 150 ; GFX90A-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 151 ; GFX90A-NEXT: [[DEF:%[0-9]+]]:vreg_96 = IMPLICIT_DEF 152 ; GFX90A-NEXT: [[COPY1:%[0-9]+]]:vreg_96_align2 = COPY killed [[DEF]] 153 ; GFX90A-NEXT: GLOBAL_STORE_DWORDX3 [[COPY]], [[COPY1]], 0, 0, implicit $exec 154 %0:vreg_64_align2 = COPY $vgpr0_vgpr1 155 %1:vreg_96 = IMPLICIT_DEF 156 %2:vreg_96_align2 = COPY killed %1 157 GLOBAL_STORE_DWORDX3 %0, %2, 0, 0, implicit $exec 158... 159 160--- 161name: aligned_vgpr_128_sub0_sub1 162tracksRegLiveness: true 163body: | 164 bb.0: 165 liveins: $vgpr0_vgpr1 166 ; GFX908-LABEL: name: aligned_vgpr_128_sub0_sub1 167 ; GFX908: liveins: $vgpr0_vgpr1 168 ; GFX908-NEXT: {{ $}} 169 ; GFX908-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 170 ; GFX908-NEXT: [[DEF:%[0-9]+]]:vreg_128_align2 = IMPLICIT_DEF 171 ; GFX908-NEXT: GLOBAL_STORE_DWORDX2 [[COPY]], [[DEF]].sub0_sub1, 0, 0, implicit $exec 172 ; 173 ; GFX90A-LABEL: name: aligned_vgpr_128_sub0_sub1 174 ; GFX90A: liveins: $vgpr0_vgpr1 175 ; GFX90A-NEXT: {{ $}} 176 ; GFX90A-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 177 ; GFX90A-NEXT: [[DEF:%[0-9]+]]:vreg_128_align2 = IMPLICIT_DEF 178 ; GFX90A-NEXT: GLOBAL_STORE_DWORDX2 [[COPY]], [[DEF]].sub0_sub1, 0, 0, implicit $exec 179 %0:vreg_64_align2 = COPY $vgpr0_vgpr1 180 %1:vreg_128_align2 = IMPLICIT_DEF 181 %2:vreg_64_align2 = COPY killed %1.sub0_sub1:vreg_128_align2 182 GLOBAL_STORE_DWORDX2 %0, %2, 0, 0, implicit $exec 183... 184 185--- 186name: aligned_vgpr_128_sub2_sub3 187tracksRegLiveness: true 188body: | 189 bb.0: 190 liveins: $vgpr0_vgpr1 191 ; GFX908-LABEL: name: aligned_vgpr_128_sub2_sub3 192 ; GFX908: liveins: $vgpr0_vgpr1 193 ; GFX908-NEXT: {{ $}} 194 ; GFX908-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 195 ; GFX908-NEXT: [[DEF:%[0-9]+]]:vreg_128_align2 = IMPLICIT_DEF 196 ; GFX908-NEXT: GLOBAL_STORE_DWORDX2 [[COPY]], [[DEF]].sub2_sub3, 0, 0, implicit $exec 197 ; 198 ; GFX90A-LABEL: name: aligned_vgpr_128_sub2_sub3 199 ; GFX90A: liveins: $vgpr0_vgpr1 200 ; GFX90A-NEXT: {{ $}} 201 ; GFX90A-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 202 ; GFX90A-NEXT: [[DEF:%[0-9]+]]:vreg_128_align2 = IMPLICIT_DEF 203 ; GFX90A-NEXT: GLOBAL_STORE_DWORDX2 [[COPY]], [[DEF]].sub2_sub3, 0, 0, implicit $exec 204 %0:vreg_64_align2 = COPY $vgpr0_vgpr1 205 %1:vreg_128_align2 = IMPLICIT_DEF 206 %2:vreg_64_align2 = COPY killed %1.sub2_sub3:vreg_128_align2 207 GLOBAL_STORE_DWORDX2 %0, %2, 0, 0, implicit $exec 208... 209 210--- 211name: unaligned_vgpr_128_sub1_sub2 212tracksRegLiveness: true 213body: | 214 bb.0: 215 liveins: $vgpr0_vgpr1 216 ; GFX908-LABEL: name: unaligned_vgpr_128_sub1_sub2 217 ; GFX908: liveins: $vgpr0_vgpr1 218 ; GFX908-NEXT: {{ $}} 219 ; GFX908-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 220 ; GFX908-NEXT: [[DEF:%[0-9]+]]:vreg_128_align2 = IMPLICIT_DEF 221 ; GFX908-NEXT: GLOBAL_STORE_DWORDX2 [[COPY]], [[DEF]].sub1_sub2, 0, 0, implicit $exec 222 ; 223 ; GFX90A-LABEL: name: unaligned_vgpr_128_sub1_sub2 224 ; GFX90A: liveins: $vgpr0_vgpr1 225 ; GFX90A-NEXT: {{ $}} 226 ; GFX90A-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 227 ; GFX90A-NEXT: [[DEF:%[0-9]+]]:vreg_128_align2 = IMPLICIT_DEF 228 ; GFX90A-NEXT: [[COPY1:%[0-9]+]]:vreg_64_align2 = COPY killed [[DEF]].sub1_sub2 229 ; GFX90A-NEXT: GLOBAL_STORE_DWORDX2 [[COPY]], [[COPY1]], 0, 0, implicit $exec 230 %0:vreg_64_align2 = COPY $vgpr0_vgpr1 231 %1:vreg_128_align2 = IMPLICIT_DEF 232 %2:vreg_64_align2 = COPY killed %1.sub1_sub2:vreg_128_align2 233 GLOBAL_STORE_DWORDX2 %0, %2, 0, 0, implicit $exec 234... 235 236--- 237name: aligned_vgpr_128_sub0_sub1_sub2 238tracksRegLiveness: true 239body: | 240 bb.0: 241 liveins: $vgpr0_vgpr1 242 ; GFX908-LABEL: name: aligned_vgpr_128_sub0_sub1_sub2 243 ; GFX908: liveins: $vgpr0_vgpr1 244 ; GFX908-NEXT: {{ $}} 245 ; GFX908-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 246 ; GFX908-NEXT: [[DEF:%[0-9]+]]:vreg_128_align2 = IMPLICIT_DEF 247 ; GFX908-NEXT: GLOBAL_STORE_DWORDX3 [[COPY]], [[DEF]].sub0_sub1_sub2, 0, 0, implicit $exec 248 ; 249 ; GFX90A-LABEL: name: aligned_vgpr_128_sub0_sub1_sub2 250 ; GFX90A: liveins: $vgpr0_vgpr1 251 ; GFX90A-NEXT: {{ $}} 252 ; GFX90A-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 253 ; GFX90A-NEXT: [[DEF:%[0-9]+]]:vreg_128_align2 = IMPLICIT_DEF 254 ; GFX90A-NEXT: GLOBAL_STORE_DWORDX3 [[COPY]], [[DEF]].sub0_sub1_sub2, 0, 0, implicit $exec 255 %0:vreg_64_align2 = COPY $vgpr0_vgpr1 256 %1:vreg_128_align2 = IMPLICIT_DEF 257 %2:vreg_96_align2 = COPY killed %1.sub0_sub1_sub2:vreg_128_align2 258 GLOBAL_STORE_DWORDX3 %0, %2, 0, 0, implicit $exec 259... 260 261--- 262name: unaligned_vgpr_128_sub1_sub2_sub3 263tracksRegLiveness: true 264body: | 265 bb.0: 266 liveins: $vgpr0_vgpr1 267 ; GFX908-LABEL: name: unaligned_vgpr_128_sub1_sub2_sub3 268 ; GFX908: liveins: $vgpr0_vgpr1 269 ; GFX908-NEXT: {{ $}} 270 ; GFX908-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 271 ; GFX908-NEXT: [[DEF:%[0-9]+]]:vreg_128_align2 = IMPLICIT_DEF 272 ; GFX908-NEXT: GLOBAL_STORE_DWORDX3 [[COPY]], [[DEF]].sub1_sub2_sub3, 0, 0, implicit $exec 273 ; 274 ; GFX90A-LABEL: name: unaligned_vgpr_128_sub1_sub2_sub3 275 ; GFX90A: liveins: $vgpr0_vgpr1 276 ; GFX90A-NEXT: {{ $}} 277 ; GFX90A-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 278 ; GFX90A-NEXT: [[DEF:%[0-9]+]]:vreg_128_align2 = IMPLICIT_DEF 279 ; GFX90A-NEXT: [[COPY1:%[0-9]+]]:vreg_96_align2 = COPY killed [[DEF]].sub1_sub2_sub3 280 ; GFX90A-NEXT: GLOBAL_STORE_DWORDX3 [[COPY]], [[COPY1]], 0, 0, implicit $exec 281 %0:vreg_64_align2 = COPY $vgpr0_vgpr1 282 %1:vreg_128_align2 = IMPLICIT_DEF 283 %2:vreg_96_align2 = COPY killed %1.sub1_sub2_sub3:vreg_128_align2 284 GLOBAL_STORE_DWORDX3 %0, %2, 0, 0, implicit $exec 285... 286 287--- 288name: aligned_vgpr_128 289tracksRegLiveness: true 290body: | 291 bb.0: 292 liveins: $vgpr0_vgpr1 293 ; GFX908-LABEL: name: aligned_vgpr_128 294 ; GFX908: liveins: $vgpr0_vgpr1 295 ; GFX908-NEXT: {{ $}} 296 ; GFX908-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 297 ; GFX908-NEXT: [[DEF:%[0-9]+]]:vreg_128_align2 = IMPLICIT_DEF 298 ; GFX908-NEXT: GLOBAL_STORE_DWORDX4 [[COPY]], [[DEF]], 0, 0, implicit $exec 299 ; 300 ; GFX90A-LABEL: name: aligned_vgpr_128 301 ; GFX90A: liveins: $vgpr0_vgpr1 302 ; GFX90A-NEXT: {{ $}} 303 ; GFX90A-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 304 ; GFX90A-NEXT: [[DEF:%[0-9]+]]:vreg_128_align2 = IMPLICIT_DEF 305 ; GFX90A-NEXT: GLOBAL_STORE_DWORDX4 [[COPY]], [[DEF]], 0, 0, implicit $exec 306 %0:vreg_64_align2 = COPY $vgpr0_vgpr1 307 %1:vreg_128_align2 = IMPLICIT_DEF 308 %2:vreg_128_align2 = COPY killed %1 309 GLOBAL_STORE_DWORDX4 %0, %2, 0, 0, implicit $exec 310... 311 312--- 313name: unaligned_vgpr_128 314tracksRegLiveness: true 315body: | 316 bb.0: 317 liveins: $vgpr0_vgpr1 318 ; GFX908-LABEL: name: unaligned_vgpr_128 319 ; GFX908: liveins: $vgpr0_vgpr1 320 ; GFX908-NEXT: {{ $}} 321 ; GFX908-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 322 ; GFX908-NEXT: [[DEF:%[0-9]+]]:vreg_128 = IMPLICIT_DEF 323 ; GFX908-NEXT: GLOBAL_STORE_DWORDX4 [[COPY]], [[DEF]], 0, 0, implicit $exec 324 ; 325 ; GFX90A-LABEL: name: unaligned_vgpr_128 326 ; GFX90A: liveins: $vgpr0_vgpr1 327 ; GFX90A-NEXT: {{ $}} 328 ; GFX90A-NEXT: [[COPY:%[0-9]+]]:vreg_64_align2 = COPY $vgpr0_vgpr1 329 ; GFX90A-NEXT: [[DEF:%[0-9]+]]:vreg_128 = IMPLICIT_DEF 330 ; GFX90A-NEXT: [[COPY1:%[0-9]+]]:vreg_128_align2 = COPY killed [[DEF]] 331 ; GFX90A-NEXT: GLOBAL_STORE_DWORDX4 [[COPY]], [[COPY1]], 0, 0, implicit $exec 332 %0:vreg_64_align2 = COPY $vgpr0_vgpr1 333 %1:vreg_128 = IMPLICIT_DEF 334 %2:vreg_128_align2 = COPY killed %1 335 GLOBAL_STORE_DWORDX4 %0, %2, 0, 0, implicit $exec 336... 337