554 lines · plain
1# RUN: llc -mtriple=amdgcn -mcpu=gfx902 -verify-machineinstrs -run-pass=si-form-memory-clauses %s -o - | FileCheck -check-prefix=GCN %s2# RUN: llc -mtriple=amdgcn -mcpu=gfx902 -passes="si-form-memory-clauses" %s -o - | FileCheck -check-prefix=GCN %s3 4# GCN-LABEL: {{^}}name: vector_clause{{$}}5# GCN: %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec6# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec7# GCN-NEXT: %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec8# GCN-NEXT: %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec9# GCN-NEXT: KILL %0{{$}}10# GCN-NEXT: %5:vreg_64 = IMPLICIT_DEF11# GCN-NEXT: GLOBAL_STORE_DWORDX4 %5, %1, 0, 0, implicit $exec12 13---14name: vector_clause15tracksRegLiveness: true16body: |17 bb.0:18 %0:vreg_64 = IMPLICIT_DEF19 %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec20 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec21 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec22 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec23 %5:vreg_64 = IMPLICIT_DEF24 GLOBAL_STORE_DWORDX4 %5, %1, 0, 0, implicit $exec25 GLOBAL_STORE_DWORDX4 %5, %2, 16, 0, implicit $exec26 GLOBAL_STORE_DWORDX4 %5, %3, 32, 0, implicit $exec27 GLOBAL_STORE_DWORDX4 %5, %4, 48, 0, implicit $exec28...29 30# This would be a valid soft clause, but there's no need for a KILL31# since the pointer uses are live beyond the end the clause.32# GCN-LABEL: {{^}}name: vector_clause_no_kill{{$}}33# GCN: %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec34# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec35# GCN-NEXT: %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec36# GCN-NEXT: %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec37# GCN-NEXT: GLOBAL_STORE_DWORDX4 %0, %1, 0, 0, implicit $exec38 39---40name: vector_clause_no_kill41tracksRegLiveness: true42body: |43 bb.0:44 %0:vreg_64 = IMPLICIT_DEF45 %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec46 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec47 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec48 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec49 GLOBAL_STORE_DWORDX4 %0, %1, 0, 0, implicit $exec50 GLOBAL_STORE_DWORDX4 %0, %2, 16, 0, implicit $exec51 GLOBAL_STORE_DWORDX4 %0, %3, 32, 0, implicit $exec52 GLOBAL_STORE_DWORDX4 %0, %4, 48, 0, implicit $exec53...54 55# GCN-LABEL: {{^}}name: subreg_full{{$}}56# GCN: undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec57# GCN-NEXT: %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec58# GCN-NEXT: %1.sub2:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec59# GCN-NEXT: %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec60# GCN-NEXT: KILL %0.sub2_sub3{{$}}61# GCN-NEXT: GLOBAL_STORE_DWORDX4 %0.sub0_sub1, %1, 0, 0, implicit $exec62 63---64name: subreg_full65tracksRegLiveness: true66registers:67 - { id: 0, class: vreg_128 }68 - { id: 1, class: vreg_128 }69body: |70 bb.0:71 %0 = IMPLICIT_DEF72 undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec73 %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec74 %1.sub2:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec75 %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec76 GLOBAL_STORE_DWORDX4 %0.sub0_sub1, %1, 0, 0, implicit $exec77...78 79# GCN-LABEL: {{^}}name: subreg_part{{$}}80# GCN: undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec81# GCN-NEXT: %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec82# GCN-NEXT: %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec83# GCN-NEXT: KILL %0.sub2_sub3{{$}}84# GCN-NEXT: GLOBAL_STORE_DWORDX4 %0.sub0_sub1, %1, 0, 0, implicit $exec85 86---87name: subreg_part88tracksRegLiveness: true89registers:90 - { id: 0, class: vreg_128 }91 - { id: 1, class: vreg_128 }92body: |93 bb.0:94 %0 = IMPLICIT_DEF95 undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec96 %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec97 %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec98 GLOBAL_STORE_DWORDX4 %0.sub0_sub1, %1, 0, 0, implicit $exec99...100 101# GCN-LABEL: {{^}}name: dead{{$}}102# GCN: dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec103# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec104# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec105# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec106# GCN-NEXT: KILL %0{{$}}107 108---109name: dead110tracksRegLiveness: true111registers:112 - { id: 0, class: vreg_64 }113 - { id: 1, class: vreg_128 }114 - { id: 2, class: vreg_128 }115 - { id: 3, class: vreg_128 }116 - { id: 4, class: vreg_128 }117body: |118 bb.0:119 %0 = IMPLICIT_DEF120 dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec121 dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec122 dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec123 dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec124...125 126# GCN-LABEL: {{^}}name: subreg_dead{{$}}127# GCN: undef %2.sub0:vreg_64 = GLOBAL_LOAD_DWORD %0, 16, 0, implicit $exec128# GCN-NEXT: dead %2.sub1:vreg_64 = GLOBAL_LOAD_DWORD %0, 32, 0, implicit $exec129# GCN-NEXT: KILL %0{{$}}130# GCN-NEXT: GLOBAL_STORE_DWORD %1, %2.sub0, 0, 0, implicit $exec131 132---133name: subreg_dead134tracksRegLiveness: true135body: |136 bb.0:137 %0:vreg_64 = IMPLICIT_DEF138 %1:vreg_64 = IMPLICIT_DEF139 undef %2.sub0:vreg_64 = GLOBAL_LOAD_DWORD %0, 16, 0, implicit $exec140 dead %2.sub1:vreg_64 = GLOBAL_LOAD_DWORD %0, 32, 0, implicit $exec141 GLOBAL_STORE_DWORD %1, %2.sub0, 0, 0, implicit $exec142...143 144# GCN-LABEL: {{^}}name: kill{{$}}145# GCN: %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec146# GCN-NEXT: %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 16, 0, implicit $exec147# GCN-NEXT: KILL %1{{$}}148# GCN-NEXT: KILL %0{{$}}149 150---151name: kill152tracksRegLiveness: true153body: |154 bb.0:155 %0:vreg_64 = IMPLICIT_DEF156 %1:vreg_64 = IMPLICIT_DEF157 %2:vreg_64 = IMPLICIT_DEF158 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec159 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 killed %1, 16, 0, implicit $exec160 GLOBAL_STORE_DWORDX4 %2, %3, 0, 0, implicit $exec161 GLOBAL_STORE_DWORDX4 %2, %4, 16, 0, implicit $exec162...163 164# GCN-LABEL: {{^}}name: indirect{{$}}165# GCN: %1:vreg_64 = GLOBAL_LOAD_DWORDX2 %0, 0, 0, implicit $exec166# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 0, 0, implicit $exec167# GCN-NEXT: %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 16, 0, implicit $exec168# GCN-NEXT: KILL %1{{$}}169 170---171name: indirect172tracksRegLiveness: true173registers:174 - { id: 0, class: vreg_64 }175 - { id: 1, class: vreg_64 }176 - { id: 2, class: vreg_128 }177 - { id: 3, class: vreg_128 }178body: |179 bb.0:180 %0 = IMPLICIT_DEF181 %1:vreg_64 = GLOBAL_LOAD_DWORDX2 %0, 0, 0, implicit $exec182 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 0, 0, implicit $exec183 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 16, 0, implicit $exec184 GLOBAL_STORE_DWORDX4 %0, %2, 0, 0, implicit $exec185 GLOBAL_STORE_DWORDX4 %0, %3, 16, 0, implicit $exec186...187 188# GCN-LABEL: {{^}}name: stack{{$}}189# GCN: %0:vreg_64 = IMPLICIT_DEF190# GCN-NEXT: %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %stack.0, 0, 0, implicit $exec191# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %stack.0, 16, 0, implicit $exec192# GCN-NEXT: GLOBAL_STORE_DWORDX4 %0, %1, 0, 0, implicit $exec193 194---195name: stack196tracksRegLiveness: true197registers:198 - { id: 0, class: vreg_64 }199 - { id: 1, class: vreg_128 }200 - { id: 2, class: vreg_128 }201stack:202 - { id: 0, type: default, offset: 0, size: 64, alignment: 8 }203body: |204 bb.0:205 %0 = IMPLICIT_DEF206 %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %stack.0, 0, 0, implicit $exec207 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %stack.0, 16, 0, implicit $exec208 GLOBAL_STORE_DWORDX4 %0, %1, 0, 0, implicit $exec209 GLOBAL_STORE_DWORDX4 %0, %2, 16, 0, implicit $exec210...211 212# GCN-LABEL: {{^}}name: overflow_counter{{$}}213# GCN: dead %2:vgpr_32 = GLOBAL_LOAD_DWORD %0, 0, 0, implicit $exec214# GCN-NEXT: dead %3:vgpr_32 = GLOBAL_LOAD_DWORD %0, 4, 0, implicit $exec215# GCN-NEXT: dead %4:vgpr_32 = GLOBAL_LOAD_DWORD %0, 8, 0, implicit $exec216# GCN-NEXT: dead %5:vgpr_32 = GLOBAL_LOAD_DWORD %0, 12, 0, implicit $exec217# GCN-NEXT: dead %6:vgpr_32 = GLOBAL_LOAD_DWORD %0, 16, 0, implicit $exec218# GCN-NEXT: dead %7:vgpr_32 = GLOBAL_LOAD_DWORD %0, 20, 0, implicit $exec219# GCN-NEXT: dead %8:vgpr_32 = GLOBAL_LOAD_DWORD %0, 24, 0, implicit $exec220# GCN-NEXT: dead %9:vgpr_32 = GLOBAL_LOAD_DWORD %0, 28, 0, implicit $exec221# GCN-NEXT: dead %10:vgpr_32 = GLOBAL_LOAD_DWORD %0, 32, 0, implicit $exec222# GCN-NEXT: dead %11:vgpr_32 = GLOBAL_LOAD_DWORD %0, 36, 0, implicit $exec223# GCN-NEXT: dead %12:vgpr_32 = GLOBAL_LOAD_DWORD %0, 40, 0, implicit $exec224# GCN-NEXT: dead %13:vgpr_32 = GLOBAL_LOAD_DWORD %0, 44, 0, implicit $exec225# GCN-NEXT: dead %14:vgpr_32 = GLOBAL_LOAD_DWORD %0, 48, 0, implicit $exec226# GCN-NEXT: dead %15:vgpr_32 = GLOBAL_LOAD_DWORD %0, 52, 0, implicit $exec227# GCN-NEXT: dead %16:vgpr_32 = GLOBAL_LOAD_DWORD %0, 56, 0, implicit $exec228# GCN-NEXT: KILL %0{{$}}229# GCN-NEXT: dead %17:vgpr_32 = GLOBAL_LOAD_DWORD %1, 60, 0, implicit $exec230# GCN-NEXT: dead %18:vgpr_32 = GLOBAL_LOAD_DWORD %1, 64, 0, implicit $exec231# GCN-NEXT: KILL %1{{$}}232 233---234name: overflow_counter235tracksRegLiveness: true236body: |237 bb.0:238 %0:vreg_64 = IMPLICIT_DEF239 %1:vreg_64 = IMPLICIT_DEF240 %2:vgpr_32 = GLOBAL_LOAD_DWORD %0, 0, 0, implicit $exec241 %3:vgpr_32 = GLOBAL_LOAD_DWORD %0, 4, 0, implicit $exec242 %4:vgpr_32 = GLOBAL_LOAD_DWORD %0, 8, 0, implicit $exec243 %5:vgpr_32 = GLOBAL_LOAD_DWORD %0, 12, 0, implicit $exec244 %6:vgpr_32 = GLOBAL_LOAD_DWORD %0, 16, 0, implicit $exec245 %7:vgpr_32 = GLOBAL_LOAD_DWORD %0, 20, 0, implicit $exec246 %8:vgpr_32 = GLOBAL_LOAD_DWORD %0, 24, 0, implicit $exec247 %9:vgpr_32 = GLOBAL_LOAD_DWORD %0, 28, 0, implicit $exec248 %10:vgpr_32 = GLOBAL_LOAD_DWORD %0, 32, 0, implicit $exec249 %11:vgpr_32 = GLOBAL_LOAD_DWORD %0, 36, 0, implicit $exec250 %12:vgpr_32 = GLOBAL_LOAD_DWORD %0, 40, 0, implicit $exec251 %13:vgpr_32 = GLOBAL_LOAD_DWORD %0, 44, 0, implicit $exec252 %14:vgpr_32 = GLOBAL_LOAD_DWORD %0, 48, 0, implicit $exec253 %15:vgpr_32 = GLOBAL_LOAD_DWORD %0, 52, 0, implicit $exec254 %16:vgpr_32 = GLOBAL_LOAD_DWORD %0, 56, 0, implicit $exec255 %17:vgpr_32 = GLOBAL_LOAD_DWORD %1, 60, 0, implicit $exec256 %18:vgpr_32 = GLOBAL_LOAD_DWORD %1, 64, 0, implicit $exec257...258 259# GCN-LABEL: {{^}}name: reg_pressure{{$}}260# GCN: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec261# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec262# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec263# GCN-NEXT: dead %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec264# GCN-NEXT: dead %6:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 64, 0, implicit $exec265# GCN-NEXT: dead %7:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 80, 0, implicit $exec266# GCN-NEXT: dead %8:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 96, 0, implicit $exec267# GCN-NEXT: dead %9:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 128, 0, implicit $exec268# GCN-NEXT: dead %10:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 144, 0, implicit $exec269# GCN-NEXT: KILL %1{{$}}270# GCN-NEXT: KILL %0{{$}}271 272---273name: reg_pressure274tracksRegLiveness: true275body: |276 bb.0:277 %0:vreg_64 = IMPLICIT_DEF278 %1:vreg_64 = IMPLICIT_DEF279 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec280 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec281 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec282 %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec283 %6:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 64, 0, implicit $exec284 %7:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 80, 0, implicit $exec285 %8:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 96, 0, implicit $exec286 %9:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 128, 0, implicit $exec287 %10:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 144, 0, implicit $exec288...289 290# GCN-LABEL: {{^}}name: image_clause{{$}}291# GCN: %3:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, undef %2:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec292# 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 $exec293# 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 $exec294# GCN-NEXT: KILL undef %2:sgpr_128{{$}}295# GCN-NEXT: IMAGE_STORE_V4_V2 %3, %0, %1, 15, -1, 0, 0, 0, 0, 0, 0, implicit $exec296 297---298name: image_clause299tracksRegLiveness: true300registers:301 - { id: 0, class: vreg_64 }302 - { id: 1, class: sgpr_256 }303 - { id: 2, class: sgpr_128 }304 - { id: 3, class: vreg_128 }305 - { id: 4, class: vreg_128 }306 - { id: 5, class: vreg_128 }307body: |308 bb.0:309 %0 = IMPLICIT_DEF310 %1 = IMPLICIT_DEF311 %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))312 %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))313 %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))314 IMAGE_STORE_V4_V2 %3, %0, %1, 15, -1, 0, 0, 0, 0, 0, 0, implicit $exec :: (store (s128))315 IMAGE_STORE_V4_V2 %4, %0, %1, 15, -1, 0, 0, 0, 0, 0, 0, implicit $exec :: (store (s128))316 IMAGE_STORE_V4_V2 %5, %0, %1, 15, -1, 0, 0, 0, 0, 0, 0, implicit $exec :: (store (s128))317...318 319# GCN-LABEL: {{^}}name: mixed_clause{{$}}320# GCN: dead %3:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, %2, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec321# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec322# GCN-NEXT: dead %5:vgpr_32 = BUFFER_LOAD_DWORD_OFFSET %2, 0, 0, 0, 0, implicit $exec323# GCN-NEXT: KILL %1{{$}}324# GCN-NEXT: KILL %2{{$}}325# GCN-NEXT: KILL %0{{$}}326 327---328name: mixed_clause329tracksRegLiveness: true330registers:331 - { id: 0, class: vreg_64 }332 - { id: 1, class: sgpr_256 }333 - { id: 2, class: sgpr_128 }334 - { id: 3, class: vreg_128 }335 - { id: 4, class: vreg_128 }336 - { id: 5, class: vgpr_32 }337body: |338 bb.0:339 %0 = IMPLICIT_DEF340 %1 = IMPLICIT_DEF341 %2 = IMPLICIT_DEF342 %3:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, %2, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (load (s128))343 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec344 %5:vgpr_32 = BUFFER_LOAD_DWORD_OFFSET %2, 0, 0, 0, 0, implicit $exec345...346 347# GCN-LABEL: {{^}}name: atomic{{$}}348# GCN: %1:vgpr_32 = IMPLICIT_DEF349# GCN-NEXT: dead %2:vgpr_32 = FLAT_ATOMIC_ADD_RTN %0, %1, 0, 2, implicit $exec, implicit $flat_scr350# GCN-NEXT: dead %3:vgpr_32 = FLAT_ATOMIC_ADD_RTN %0, %1, 0, 2, implicit $exec, implicit $flat_scr351# GCN-NEXT: FLAT_ATOMIC_ADD %0, %1, 0, 0, implicit $exec, implicit $flat_scr352# GCN-NEXT: FLAT_ATOMIC_ADD %0, %1, 0, 0, implicit $exec, implicit $flat_scr353# GCN-NEXT: S_ENDPGM 0354 355---356name: atomic357tracksRegLiveness: true358registers:359 - { id: 0, class: vreg_64 }360 - { id: 1, class: vgpr_32 }361 - { id: 2, class: vgpr_32 }362 - { id: 3, class: vgpr_32 }363body: |364 bb.0:365 %0 = IMPLICIT_DEF366 %1 = IMPLICIT_DEF367 %2:vgpr_32 = FLAT_ATOMIC_ADD_RTN %0, %1, 0, 2, implicit $exec, implicit $flat_scr368 %3:vgpr_32 = FLAT_ATOMIC_ADD_RTN %0, %1, 0, 2, implicit $exec, implicit $flat_scr369 FLAT_ATOMIC_ADD %0, %1, 0, 0, implicit $exec, implicit $flat_scr370 FLAT_ATOMIC_ADD %0, %1, 0, 0, implicit $exec, implicit $flat_scr371 S_ENDPGM 0372...373 374# One of the pointers has an additional use after the clause, but one375# doesn't. Only the final use should be killed.376 377# GCN-LABEL: {{^}}name: ptr_use_after_clause{{$}}378# GCN: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec379# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 16, 0, implicit $exec380# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec381# GCN-NEXT: dead %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 48, 0, implicit $exec382# GCN-NEXT: KILL %1{{$}}383# GCN-NEXT: S_NOP 0, implicit %0384---385name: ptr_use_after_clause386tracksRegLiveness: true387body: |388 bb.0:389 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3390 %0:vreg_64 = COPY $vgpr0_vgpr1391 %1:vreg_64 = COPY $vgpr2_vgpr3392 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec393 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 16, 0, implicit $exec394 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec395 %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 48, 0, implicit $exec396 S_NOP 0, implicit %0397...398 399# Only part of the register is really live past the clause.400# GCN-LABEL: {{^}}name: ptr_use_after_clause_subreg{{$}}401# GCN: dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec402# GCN-NEXT: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec403# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec404# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 48, 0, implicit $exec405# GCN-NEXT: KILL %0.sub2_sub3{{$}}406# GCN-NEXT: S_NOP 0, implicit %0.sub0_sub1{{$}}407---408name: ptr_use_after_clause_subreg409tracksRegLiveness: true410body: |411 bb.0:412 liveins: $vgpr0_vgpr1_vgpr2_vgpr3413 %0:vreg_128 = COPY $vgpr0_vgpr1_vgpr2_vgpr3414 %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec415 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec416 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec417 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 48, 0, implicit $exec418 S_NOP 0, implicit %0.sub0_sub1419...420 421# More complex situation where only some of the use subregisters live422# beyond the clause.423 424# GCN-LABEL: {{^}}name: ptr_use_after_clause_subreg_multi{{$}}425# GCN: dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec426# GCN-NEXT: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec427# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub3_sub4, 32, 0, implicit $exec428# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub6_sub7, 48, 0, implicit $exec429# GCN-NEXT: KILL %0.sub2_sub3_sub4, %0.sub7{{$}}430# GCN-NEXT: S_NOP 0, implicit %0.sub0_sub1, implicit %0.sub5_sub6431---432name: ptr_use_after_clause_subreg_multi433tracksRegLiveness: true434body: |435 bb.0:436 liveins: $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7437 %0:vreg_256 = COPY $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7438 %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec439 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec440 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub3_sub4, 32, 0, implicit $exec441 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub6_sub7, 48, 0, implicit $exec442 S_NOP 0, implicit %0.sub0_sub1, implicit %0.sub5_sub6443...444 445# Have subranges, but none of them are killed446# GCN-LABEL: {{^}}name: no_killed_subranges{{$}}447# GCN: dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec448# GCN-NEXT: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec449# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec450# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 48, 0, implicit $exec451# GCN-NEXT: S_NOP 0, implicit %0.sub0_sub1{{$}}452# GCN-NEXT: S_NOP 0, implicit %0.sub2_sub3{{$}}453---454name: no_killed_subranges455tracksRegLiveness: true456body: |457 bb.0:458 liveins: $vgpr0_vgpr1_vgpr2_vgpr3459 %0:vreg_128 = COPY $vgpr0_vgpr1_vgpr2_vgpr3460 %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec461 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec462 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec463 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 48, 0, implicit $exec464 S_NOP 0, implicit %0.sub0_sub1465 S_NOP 0, implicit %0.sub2_sub3466...467 468# sub2 is undef at entry to the soft clause. It should not be have its469# live range extended.470 471# GCN-LABEL: name: no_killed_undef_subrange_use472# GCN: dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec473# GCN-NEXT: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec474# GCN-NEXT: KILL %0.sub0_sub1{{$}}475# GCN-NEXT: %0.sub2:vreg_128 = V_MOV_B32_e32 0, implicit $exec476# GCN-NEXT: S_NOP 0, implicit %0.sub2477---478name: no_killed_undef_subrange_use479tracksRegLiveness: true480body: |481 bb.0:482 liveins: $vgpr0_vgpr1483 undef %0.sub0_sub1:vreg_128 = COPY $vgpr0_vgpr1484 %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec485 %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec486 %0.sub2:vreg_128 = V_MOV_B32_e32 0, implicit $exec487 S_NOP 0, implicit %0.sub2488...489 490# Make sure intervening implicit_defs are not treated as breaking the491# clause492#493# GCN-LABEL: {{^}}name: implicit_def_no_break{{$}}494# GCN: %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec495# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec496# GCN-NEXT: %3:vreg_64 = IMPLICIT_DEF497# GCN-NEXT: %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %3, 32, 0, implicit $exec498# GCN-NEXT: %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %3, 48, 0, implicit $exec499# GCN-NEXT: KILL %3{{$}}500# GCN-NEXT: KILL %0{{$}}501---502name: implicit_def_no_break503tracksRegLiveness: true504body: |505 bb.0:506 liveins: $vgpr0_vgpr1507 %0:vreg_64 = COPY $vgpr0_vgpr1508 %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec509 %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec510 %3:vreg_64 = IMPLICIT_DEF511 %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %3, 32, 0, implicit $exec512 %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %3, 48, 0, implicit $exec513 S_NOP 0, implicit %1, implicit %2, implicit %4, implicit %5514...515 516# GCN-LABEL: {{^}}name: kill_part_subreg{{$}}517# GCN: undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec518# GCN-NEXT: %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec519# GCN-NEXT: %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec520# GCN-NEXT: KILL %0.sub0_sub1_sub2, %0.sub3521---522name: kill_part_subreg523tracksRegLiveness: true524body: |525 bb.0:526 liveins: $vgpr0_vgpr1_vgpr2_vgpr3527 %0:vreg_128 = COPY $vgpr0_vgpr1_vgpr2_vgpr3528 undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec529 %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec530 %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec531 S_NOP 0, implicit %1532...533 534# GCN-LABEL: {{^}}name: mem_clause_sreg256_used_stack{{$}}535# GCN: undef %0.sub7:sgpr_256 = S_LOAD_DWORD_IMM undef %1:sgpr_64(p4), 8, 0536# GCN-NEXT: dead %0.sub3:sgpr_256 = S_LOAD_DWORD_IMM undef %1:sgpr_64(p4), 24, 0537# GCN-NEXT: KILL undef %1538---539name: mem_clause_sreg256_used_stack540stack:541 - { id: 0, type: default, offset: 0, size: 40, alignment: 8 }542machineFunctionInfo:543 isEntryFunction: true544 scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3'545 stackPtrOffsetReg: '$sgpr32'546body: |547 bb.0:548 549 undef %0.sub7:sgpr_256 = S_LOAD_DWORD_IMM undef %1:sgpr_64(p4), 8, 0550 %0.sub3:sgpr_256 = S_LOAD_DWORD_IMM undef %1:sgpr_64(p4), 24, 0551 S_ENDPGM 0552 553...554