1# RUN: llc -march=amdgcn -mcpu=gfx902 -verify-machineinstrs -run-pass=si-form-memory-clauses %s -o - | FileCheck -check-prefix=GCN %s 2 3# GCN-LABEL: {{^}}name: vector_clause{{$}} 4# GCN: %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec 5# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec 6# GCN-NEXT: %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec 7# GCN-NEXT: %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec 8# GCN-NEXT: KILL %0{{$}} 9# GCN-NEXT: %5:vreg_64 = IMPLICIT_DEF 10# GCN-NEXT: GLOBAL_STORE_DWORDX4 %5, %1, 0, 0, implicit $exec 11 12--- 13name: vector_clause 14tracksRegLiveness: true 15body: | 16 bb.0: 17 %0:vreg_64 = IMPLICIT_DEF 18 %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec 19 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec 20 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec 21 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec 22 %5:vreg_64 = IMPLICIT_DEF 23 GLOBAL_STORE_DWORDX4 %5, %1, 0, 0, implicit $exec 24 GLOBAL_STORE_DWORDX4 %5, %2, 16, 0, implicit $exec 25 GLOBAL_STORE_DWORDX4 %5, %3, 32, 0, implicit $exec 26 GLOBAL_STORE_DWORDX4 %5, %4, 48, 0, implicit $exec 27... 28 29# This would be a valid soft clause, but there's no need for a KILL 30# since the pointer uses are live beyond the end the clause. 31# GCN-LABEL: {{^}}name: vector_clause_no_kill{{$}} 32# GCN: %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec 33# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec 34# GCN-NEXT: %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec 35# GCN-NEXT: %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec 36# GCN-NEXT: GLOBAL_STORE_DWORDX4 %0, %1, 0, 0, implicit $exec 37 38--- 39name: vector_clause_no_kill 40tracksRegLiveness: true 41body: | 42 bb.0: 43 %0:vreg_64 = IMPLICIT_DEF 44 %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec 45 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec 46 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec 47 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec 48 GLOBAL_STORE_DWORDX4 %0, %1, 0, 0, implicit $exec 49 GLOBAL_STORE_DWORDX4 %0, %2, 16, 0, implicit $exec 50 GLOBAL_STORE_DWORDX4 %0, %3, 32, 0, implicit $exec 51 GLOBAL_STORE_DWORDX4 %0, %4, 48, 0, implicit $exec 52... 53 54# GCN-LABEL: {{^}}name: subreg_full{{$}} 55# GCN: undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec 56# GCN-NEXT: %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec 57# GCN-NEXT: %1.sub2:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec 58# GCN-NEXT: %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec 59# GCN-NEXT: KILL %0.sub2_sub3{{$}} 60# GCN-NEXT: GLOBAL_STORE_DWORDX4 %0.sub0_sub1, %1, 0, 0, implicit $exec 61 62--- 63name: subreg_full 64tracksRegLiveness: true 65registers: 66 - { id: 0, class: vreg_128 } 67 - { id: 1, class: vreg_128 } 68body: | 69 bb.0: 70 %0 = IMPLICIT_DEF 71 undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec 72 %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec 73 %1.sub2:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec 74 %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec 75 GLOBAL_STORE_DWORDX4 %0.sub0_sub1, %1, 0, 0, implicit $exec 76... 77 78# GCN-LABEL: {{^}}name: subreg_part{{$}} 79# GCN: undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec 80# GCN-NEXT: %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec 81# GCN-NEXT: %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec 82# GCN-NEXT: KILL %0.sub2_sub3{{$}} 83# GCN-NEXT: GLOBAL_STORE_DWORDX4 %0.sub0_sub1, %1, 0, 0, implicit $exec 84 85--- 86name: subreg_part 87tracksRegLiveness: true 88registers: 89 - { id: 0, class: vreg_128 } 90 - { id: 1, class: vreg_128 } 91body: | 92 bb.0: 93 %0 = IMPLICIT_DEF 94 undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec 95 %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec 96 %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec 97 GLOBAL_STORE_DWORDX4 %0.sub0_sub1, %1, 0, 0, implicit $exec 98... 99 100# GCN-LABEL: {{^}}name: dead{{$}} 101# GCN: dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec 102# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec 103# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec 104# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec 105# GCN-NEXT: KILL %0{{$}} 106 107--- 108name: dead 109tracksRegLiveness: true 110registers: 111 - { id: 0, class: vreg_64 } 112 - { id: 1, class: vreg_128 } 113 - { id: 2, class: vreg_128 } 114 - { id: 3, class: vreg_128 } 115 - { id: 4, class: vreg_128 } 116body: | 117 bb.0: 118 %0 = IMPLICIT_DEF 119 dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec 120 dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec 121 dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec 122 dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec 123... 124 125# GCN-LABEL: {{^}}name: subreg_dead{{$}} 126# GCN: undef %2.sub0:vreg_64 = GLOBAL_LOAD_DWORD %0, 16, 0, implicit $exec 127# GCN-NEXT: dead %2.sub1:vreg_64 = GLOBAL_LOAD_DWORD %0, 32, 0, implicit $exec 128# GCN-NEXT: KILL %0{{$}} 129# GCN-NEXT: GLOBAL_STORE_DWORD %1, %2.sub0, 0, 0, implicit $exec 130 131--- 132name: subreg_dead 133tracksRegLiveness: true 134body: | 135 bb.0: 136 %0:vreg_64 = IMPLICIT_DEF 137 %1:vreg_64 = IMPLICIT_DEF 138 undef %2.sub0:vreg_64 = GLOBAL_LOAD_DWORD %0, 16, 0, implicit $exec 139 dead %2.sub1:vreg_64 = GLOBAL_LOAD_DWORD %0, 32, 0, implicit $exec 140 GLOBAL_STORE_DWORD %1, %2.sub0, 0, 0, implicit $exec 141... 142 143# GCN-LABEL: {{^}}name: kill{{$}} 144# GCN: %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec 145# GCN-NEXT: %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 16, 0, implicit $exec 146# GCN-NEXT: KILL %1{{$}} 147# GCN-NEXT: KILL %0{{$}} 148 149--- 150name: kill 151tracksRegLiveness: true 152body: | 153 bb.0: 154 %0:vreg_64 = IMPLICIT_DEF 155 %1:vreg_64 = IMPLICIT_DEF 156 %2:vreg_64 = IMPLICIT_DEF 157 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec 158 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 killed %1, 16, 0, implicit $exec 159 GLOBAL_STORE_DWORDX4 %2, %3, 0, 0, implicit $exec 160 GLOBAL_STORE_DWORDX4 %2, %4, 16, 0, implicit $exec 161... 162 163# GCN-LABEL: {{^}}name: indirect{{$}} 164# GCN: %1:vreg_64 = GLOBAL_LOAD_DWORDX2 %0, 0, 0, implicit $exec 165# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 0, 0, implicit $exec 166# GCN-NEXT: %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 16, 0, implicit $exec 167# GCN-NEXT: KILL %1{{$}} 168 169--- 170name: indirect 171tracksRegLiveness: true 172registers: 173 - { id: 0, class: vreg_64 } 174 - { id: 1, class: vreg_64 } 175 - { id: 2, class: vreg_128 } 176 - { id: 3, class: vreg_128 } 177body: | 178 bb.0: 179 %0 = IMPLICIT_DEF 180 %1:vreg_64 = GLOBAL_LOAD_DWORDX2 %0, 0, 0, implicit $exec 181 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 0, 0, implicit $exec 182 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 16, 0, implicit $exec 183 GLOBAL_STORE_DWORDX4 %0, %2, 0, 0, implicit $exec 184 GLOBAL_STORE_DWORDX4 %0, %3, 16, 0, implicit $exec 185... 186 187# GCN-LABEL: {{^}}name: stack{{$}} 188# GCN: %0:vreg_64 = IMPLICIT_DEF 189# GCN-NEXT: %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %stack.0, 0, 0, implicit $exec 190# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %stack.0, 16, 0, implicit $exec 191# GCN-NEXT: GLOBAL_STORE_DWORDX4 %0, %1, 0, 0, implicit $exec 192 193--- 194name: stack 195tracksRegLiveness: true 196registers: 197 - { id: 0, class: vreg_64 } 198 - { id: 1, class: vreg_128 } 199 - { id: 2, class: vreg_128 } 200stack: 201 - { id: 0, type: default, offset: 0, size: 64, alignment: 8 } 202body: | 203 bb.0: 204 %0 = IMPLICIT_DEF 205 %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %stack.0, 0, 0, implicit $exec 206 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %stack.0, 16, 0, implicit $exec 207 GLOBAL_STORE_DWORDX4 %0, %1, 0, 0, implicit $exec 208 GLOBAL_STORE_DWORDX4 %0, %2, 16, 0, implicit $exec 209... 210 211# GCN-LABEL: {{^}}name: overflow_counter{{$}} 212# GCN: dead %2:vgpr_32 = GLOBAL_LOAD_DWORD %0, 0, 0, implicit $exec 213# GCN-NEXT: dead %3:vgpr_32 = GLOBAL_LOAD_DWORD %0, 4, 0, implicit $exec 214# GCN-NEXT: dead %4:vgpr_32 = GLOBAL_LOAD_DWORD %0, 8, 0, implicit $exec 215# GCN-NEXT: dead %5:vgpr_32 = GLOBAL_LOAD_DWORD %0, 12, 0, implicit $exec 216# GCN-NEXT: dead %6:vgpr_32 = GLOBAL_LOAD_DWORD %0, 16, 0, implicit $exec 217# GCN-NEXT: dead %7:vgpr_32 = GLOBAL_LOAD_DWORD %0, 20, 0, implicit $exec 218# GCN-NEXT: dead %8:vgpr_32 = GLOBAL_LOAD_DWORD %0, 24, 0, implicit $exec 219# GCN-NEXT: dead %9:vgpr_32 = GLOBAL_LOAD_DWORD %0, 28, 0, implicit $exec 220# GCN-NEXT: dead %10:vgpr_32 = GLOBAL_LOAD_DWORD %0, 32, 0, implicit $exec 221# GCN-NEXT: dead %11:vgpr_32 = GLOBAL_LOAD_DWORD %0, 36, 0, implicit $exec 222# GCN-NEXT: dead %12:vgpr_32 = GLOBAL_LOAD_DWORD %0, 40, 0, implicit $exec 223# GCN-NEXT: dead %13:vgpr_32 = GLOBAL_LOAD_DWORD %0, 44, 0, implicit $exec 224# GCN-NEXT: dead %14:vgpr_32 = GLOBAL_LOAD_DWORD %0, 48, 0, implicit $exec 225# GCN-NEXT: dead %15:vgpr_32 = GLOBAL_LOAD_DWORD %0, 52, 0, implicit $exec 226# GCN-NEXT: dead %16:vgpr_32 = GLOBAL_LOAD_DWORD %0, 56, 0, implicit $exec 227# GCN-NEXT: KILL %0{{$}} 228# GCN-NEXT: dead %17:vgpr_32 = GLOBAL_LOAD_DWORD %1, 60, 0, implicit $exec 229# GCN-NEXT: dead %18:vgpr_32 = GLOBAL_LOAD_DWORD %1, 64, 0, implicit $exec 230# GCN-NEXT: KILL %1{{$}} 231 232--- 233name: overflow_counter 234tracksRegLiveness: true 235body: | 236 bb.0: 237 %0:vreg_64 = IMPLICIT_DEF 238 %1:vreg_64 = IMPLICIT_DEF 239 %2:vgpr_32 = GLOBAL_LOAD_DWORD %0, 0, 0, implicit $exec 240 %3:vgpr_32 = GLOBAL_LOAD_DWORD %0, 4, 0, implicit $exec 241 %4:vgpr_32 = GLOBAL_LOAD_DWORD %0, 8, 0, implicit $exec 242 %5:vgpr_32 = GLOBAL_LOAD_DWORD %0, 12, 0, implicit $exec 243 %6:vgpr_32 = GLOBAL_LOAD_DWORD %0, 16, 0, implicit $exec 244 %7:vgpr_32 = GLOBAL_LOAD_DWORD %0, 20, 0, implicit $exec 245 %8:vgpr_32 = GLOBAL_LOAD_DWORD %0, 24, 0, implicit $exec 246 %9:vgpr_32 = GLOBAL_LOAD_DWORD %0, 28, 0, implicit $exec 247 %10:vgpr_32 = GLOBAL_LOAD_DWORD %0, 32, 0, implicit $exec 248 %11:vgpr_32 = GLOBAL_LOAD_DWORD %0, 36, 0, implicit $exec 249 %12:vgpr_32 = GLOBAL_LOAD_DWORD %0, 40, 0, implicit $exec 250 %13:vgpr_32 = GLOBAL_LOAD_DWORD %0, 44, 0, implicit $exec 251 %14:vgpr_32 = GLOBAL_LOAD_DWORD %0, 48, 0, implicit $exec 252 %15:vgpr_32 = GLOBAL_LOAD_DWORD %0, 52, 0, implicit $exec 253 %16:vgpr_32 = GLOBAL_LOAD_DWORD %0, 56, 0, implicit $exec 254 %17:vgpr_32 = GLOBAL_LOAD_DWORD %1, 60, 0, implicit $exec 255 %18:vgpr_32 = GLOBAL_LOAD_DWORD %1, 64, 0, implicit $exec 256... 257 258# GCN-LABEL: {{^}}name: reg_pressure{{$}} 259# GCN: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec 260# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec 261# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec 262# GCN-NEXT: dead %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec 263# GCN-NEXT: dead %6:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 64, 0, implicit $exec 264# GCN-NEXT: KILL %0{{$}} 265# GCN-NEXT: dead %7:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 80, 0, implicit $exec 266# GCN-NEXT: dead %8:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 96, 0, implicit $exec 267# GCN-NEXT: KILL %1{{$}} 268 269--- 270name: reg_pressure 271tracksRegLiveness: true 272body: | 273 bb.0: 274 %0:vreg_64 = IMPLICIT_DEF 275 %1:vreg_64 = IMPLICIT_DEF 276 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec 277 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec 278 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec 279 %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec 280 %6:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 64, 0, implicit $exec 281 %7:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 80, 0, implicit $exec 282 %8:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 96, 0, implicit $exec 283... 284 285# GCN-LABEL: {{^}}name: image_clause{{$}} 286# GCN: %3:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, undef %2:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec 287# GCN-NEXT: %4:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, undef %2:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec 288# GCN-NEXT: %5:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, undef %2:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec 289# GCN-NEXT: KILL undef %2:sgpr_128{{$}} 290# GCN-NEXT: IMAGE_STORE_V4_V2 %3, %0, %1, 15, -1, 0, 0, 0, 0, 0, 0, implicit $exec 291 292--- 293name: image_clause 294tracksRegLiveness: true 295registers: 296 - { id: 0, class: vreg_64 } 297 - { id: 1, class: sgpr_256 } 298 - { id: 2, class: sgpr_128 } 299 - { id: 3, class: vreg_128 } 300 - { id: 4, class: vreg_128 } 301 - { id: 5, class: vreg_128 } 302body: | 303 bb.0: 304 %0 = IMPLICIT_DEF 305 %1 = IMPLICIT_DEF 306 %3:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, undef %2:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (load (s128)) 307 %4:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, undef %2:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (load (s128)) 308 %5:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, undef %2:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (load (s128)) 309 IMAGE_STORE_V4_V2 %3, %0, %1, 15, -1, 0, 0, 0, 0, 0, 0, implicit $exec :: (store (s128)) 310 IMAGE_STORE_V4_V2 %4, %0, %1, 15, -1, 0, 0, 0, 0, 0, 0, implicit $exec :: (store (s128)) 311 IMAGE_STORE_V4_V2 %5, %0, %1, 15, -1, 0, 0, 0, 0, 0, 0, implicit $exec :: (store (s128)) 312... 313 314# GCN-LABEL: {{^}}name: mixed_clause{{$}} 315# GCN: dead %3:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, %2, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec 316# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec 317# GCN-NEXT: dead %5:vgpr_32 = BUFFER_LOAD_DWORD_OFFSET %2, 0, 0, 0, 0, 0, implicit $exec 318# GCN-NEXT: KILL %1{{$}} 319# GCN-NEXT: KILL %2{{$}} 320# GCN-NEXT: KILL %0{{$}} 321 322--- 323name: mixed_clause 324tracksRegLiveness: true 325registers: 326 - { id: 0, class: vreg_64 } 327 - { id: 1, class: sgpr_256 } 328 - { id: 2, class: sgpr_128 } 329 - { id: 3, class: vreg_128 } 330 - { id: 4, class: vreg_128 } 331 - { id: 5, class: vgpr_32 } 332body: | 333 bb.0: 334 %0 = IMPLICIT_DEF 335 %1 = IMPLICIT_DEF 336 %2 = IMPLICIT_DEF 337 %3:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, %2, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (load (s128)) 338 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec 339 %5:vgpr_32 = BUFFER_LOAD_DWORD_OFFSET %2, 0, 0, 0, 0, 0, implicit $exec 340... 341 342# GCN-LABEL: {{^}}name: atomic{{$}} 343# GCN: %1:vgpr_32 = IMPLICIT_DEF 344# GCN-NEXT: dead %2:vgpr_32 = FLAT_ATOMIC_ADD_RTN %0, %1, 0, 2, implicit $exec, implicit $flat_scr 345# GCN-NEXT: dead %3:vgpr_32 = FLAT_ATOMIC_ADD_RTN %0, %1, 0, 2, implicit $exec, implicit $flat_scr 346# GCN-NEXT: FLAT_ATOMIC_ADD %0, %1, 0, 0, implicit $exec, implicit $flat_scr 347# GCN-NEXT: FLAT_ATOMIC_ADD %0, %1, 0, 0, implicit $exec, implicit $flat_scr 348# GCN-NEXT: S_ENDPGM 0 349 350--- 351name: atomic 352tracksRegLiveness: true 353registers: 354 - { id: 0, class: vreg_64 } 355 - { id: 1, class: vgpr_32 } 356 - { id: 2, class: vgpr_32 } 357 - { id: 3, class: vgpr_32 } 358body: | 359 bb.0: 360 %0 = IMPLICIT_DEF 361 %1 = IMPLICIT_DEF 362 %2:vgpr_32 = FLAT_ATOMIC_ADD_RTN %0, %1, 0, 2, implicit $exec, implicit $flat_scr 363 %3:vgpr_32 = FLAT_ATOMIC_ADD_RTN %0, %1, 0, 2, implicit $exec, implicit $flat_scr 364 FLAT_ATOMIC_ADD %0, %1, 0, 0, implicit $exec, implicit $flat_scr 365 FLAT_ATOMIC_ADD %0, %1, 0, 0, implicit $exec, implicit $flat_scr 366 S_ENDPGM 0 367... 368 369# One of the pointers has an additional use after the clause, but one 370# doesn't. Only the final use should be killed. 371 372# GCN-LABEL: {{^}}name: ptr_use_after_clause{{$}} 373# GCN: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec 374# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 16, 0, implicit $exec 375# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec 376# GCN-NEXT: dead %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 48, 0, implicit $exec 377# GCN-NEXT: KILL %1{{$}} 378# GCN-NEXT: S_NOP 0, implicit %0 379--- 380name: ptr_use_after_clause 381tracksRegLiveness: true 382body: | 383 bb.0: 384 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 385 %0:vreg_64 = COPY $vgpr0_vgpr1 386 %1:vreg_64 = COPY $vgpr2_vgpr3 387 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec 388 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 16, 0, implicit $exec 389 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec 390 %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 48, 0, implicit $exec 391 S_NOP 0, implicit %0 392... 393 394# Only part of the register is really live past the clause. 395# GCN-LABEL: {{^}}name: ptr_use_after_clause_subreg{{$}} 396# GCN: dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec 397# GCN-NEXT: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec 398# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec 399# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 48, 0, implicit $exec 400# GCN-NEXT: KILL %0.sub2_sub3{{$}} 401# GCN-NEXT: S_NOP 0, implicit %0.sub0_sub1{{$}} 402--- 403name: ptr_use_after_clause_subreg 404tracksRegLiveness: true 405body: | 406 bb.0: 407 liveins: $vgpr0_vgpr1_vgpr2_vgpr3 408 %0:vreg_128 = COPY $vgpr0_vgpr1_vgpr2_vgpr3 409 %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec 410 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec 411 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec 412 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 48, 0, implicit $exec 413 S_NOP 0, implicit %0.sub0_sub1 414... 415 416# More complex situation where only some of the use subregisters live 417# beyond the clause. 418 419# GCN-LABEL: {{^}}name: ptr_use_after_clause_subreg_multi{{$}} 420# GCN: dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec 421# GCN-NEXT: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec 422# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub3_sub4, 32, 0, implicit $exec 423# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub6_sub7, 48, 0, implicit $exec 424# GCN-NEXT: KILL %0.sub2_sub3_sub4, %0.sub7{{$}} 425# GCN-NEXT: S_NOP 0, implicit %0.sub0_sub1, implicit %0.sub5_sub6 426--- 427name: ptr_use_after_clause_subreg_multi 428tracksRegLiveness: true 429body: | 430 bb.0: 431 liveins: $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7 432 %0:vreg_256 = COPY $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7 433 %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec 434 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec 435 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub3_sub4, 32, 0, implicit $exec 436 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub6_sub7, 48, 0, implicit $exec 437 S_NOP 0, implicit %0.sub0_sub1, implicit %0.sub5_sub6 438... 439 440# Have subranges, but none of them are killed 441# GCN-LABEL: {{^}}name: no_killed_subranges{{$}} 442# GCN: dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec 443# GCN-NEXT: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec 444# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec 445# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 48, 0, implicit $exec 446# GCN-NEXT: S_NOP 0, implicit %0.sub0_sub1{{$}} 447# GCN-NEXT: S_NOP 0, implicit %0.sub2_sub3{{$}} 448--- 449name: no_killed_subranges 450tracksRegLiveness: true 451body: | 452 bb.0: 453 liveins: $vgpr0_vgpr1_vgpr2_vgpr3 454 %0:vreg_128 = COPY $vgpr0_vgpr1_vgpr2_vgpr3 455 %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec 456 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec 457 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec 458 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 48, 0, implicit $exec 459 S_NOP 0, implicit %0.sub0_sub1 460 S_NOP 0, implicit %0.sub2_sub3 461... 462 463# sub2 is undef at entry to the soft clause. It should not be have its 464# live range extended. 465 466# GCN-LABEL: name: no_killed_undef_subrange_use 467# GCN: dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec 468# GCN-NEXT: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec 469# GCN-NEXT: KILL %0.sub0_sub1{{$}} 470# GCN-NEXT: %0.sub2:vreg_128 = V_MOV_B32_e32 0, implicit $exec 471# GCN-NEXT: S_NOP 0, implicit %0.sub2 472--- 473name: no_killed_undef_subrange_use 474tracksRegLiveness: true 475body: | 476 bb.0: 477 liveins: $vgpr0_vgpr1 478 undef %0.sub0_sub1:vreg_128 = COPY $vgpr0_vgpr1 479 %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec 480 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec 481 %0.sub2:vreg_128 = V_MOV_B32_e32 0, implicit $exec 482 S_NOP 0, implicit %0.sub2 483... 484 485# Make sure intervening implicit_defs are not treated as breaking the 486# clause 487# 488# GCN-LABEL: {{^}}name: implicit_def_no_break{{$}} 489# GCN: %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec 490# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec 491# GCN-NEXT: %3:vreg_64 = IMPLICIT_DEF 492# GCN-NEXT: %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %3, 32, 0, implicit $exec 493# GCN-NEXT: %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %3, 48, 0, implicit $exec 494# GCN-NEXT: KILL %3{{$}} 495# GCN-NEXT: KILL %0{{$}} 496--- 497name: implicit_def_no_break 498tracksRegLiveness: true 499body: | 500 bb.0: 501 liveins: $vgpr0_vgpr1 502 %0:vreg_64 = COPY $vgpr0_vgpr1 503 %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec 504 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec 505 %3:vreg_64 = IMPLICIT_DEF 506 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %3, 32, 0, implicit $exec 507 %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %3, 48, 0, implicit $exec 508 S_NOP 0, implicit %1, implicit %2, implicit %4, implicit %5 509... 510 511# GCN-LABEL: {{^}}name: kill_part_subreg{{$}} 512# GCN: undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec 513# GCN-NEXT: %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec 514# GCN-NEXT: %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec 515# GCN-NEXT: KILL %0.sub0_sub1_sub2, %0.sub3 516--- 517name: kill_part_subreg 518tracksRegLiveness: true 519body: | 520 bb.0: 521 liveins: $vgpr0_vgpr1_vgpr2_vgpr3 522 %0:vreg_128 = COPY $vgpr0_vgpr1_vgpr2_vgpr3 523 undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec 524 %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec 525 %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec 526 S_NOP 0, implicit %1 527... 528 529# GCN-LABEL: {{^}}name: mem_clause_sreg256_used_stack{{$}} 530# GCN: undef %0.sub7:sgpr_256 = S_LOAD_DWORD_IMM undef %1:sgpr_64(p4), 8, 0 531# GCN-NEXT: dead %0.sub3:sgpr_256 = S_LOAD_DWORD_IMM undef %1:sgpr_64(p4), 24, 0 532# GCN-NEXT: KILL undef %1 533--- 534name: mem_clause_sreg256_used_stack 535stack: 536 - { id: 0, type: default, offset: 0, size: 40, alignment: 8 } 537machineFunctionInfo: 538 isEntryFunction: true 539 scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3' 540 stackPtrOffsetReg: '$sgpr32' 541body: | 542 bb.0: 543 544 undef %0.sub7:sgpr_256 = S_LOAD_DWORD_IMM undef %1:sgpr_64(p4), 8, 0 545 %0.sub3:sgpr_256 = S_LOAD_DWORD_IMM undef %1:sgpr_64(p4), 24, 0 546 S_ENDPGM 0 547 548... 549