| # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py |
| # RUN: llc -mtriple=amdgcn -mcpu=gfx900 -verify-machineinstrs -run-pass=si-post-ra-bundler %s -o - | FileCheck -check-prefix=GCN %s |
| # RUN: llc -mtriple=amdgcn -mcpu=gfx900 -passes=si-post-ra-bundler %s -o - | FileCheck -check-prefix=GCN %s |
| |
| --- |
| name: bundle_memops |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| ; GCN-LABEL: name: bundle_memops |
| ; GCN: $vgpr0 = GLOBAL_LOAD_DWORD undef $vgpr3_vgpr4, 0, 0, implicit $exec |
| ; GCN-NEXT: S_NOP 0 |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr0, implicit-def $vgpr1, implicit undef $vgpr3_vgpr4, implicit $exec { |
| ; GCN-NEXT: $vgpr0 = GLOBAL_LOAD_DWORD undef $vgpr3_vgpr4, 0, 0, implicit $exec |
| ; GCN-NEXT: $vgpr1 = GLOBAL_LOAD_DWORD undef $vgpr3_vgpr4, 4, 0, implicit $exec |
| ; GCN-NEXT: } |
| ; GCN-NEXT: S_NOP 0 |
| ; GCN-NEXT: $vgpr0 = GLOBAL_LOAD_DWORD undef $vgpr3_vgpr4, 0, 0, implicit $exec |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr1, implicit-def $vgpr2, implicit-def $vgpr5, implicit undef $vgpr0_vgpr1, implicit $exec, implicit undef $vgpr3_vgpr4 { |
| ; GCN-NEXT: $vgpr1 = GLOBAL_LOAD_DWORD undef $vgpr0_vgpr1, 4, 0, implicit $exec |
| ; GCN-NEXT: $vgpr2 = GLOBAL_LOAD_DWORD undef $vgpr3_vgpr4, 4, 0, implicit $exec |
| ; GCN-NEXT: $vgpr5 = GLOBAL_LOAD_DWORD undef $vgpr3_vgpr4, 0, 0, implicit $exec |
| ; GCN-NEXT: } |
| ; GCN-NEXT: BUNDLE implicit undef $vgpr3_vgpr4, implicit $vgpr1, implicit $exec, implicit $vgpr0 { |
| ; GCN-NEXT: GLOBAL_STORE_DWORD undef $vgpr3_vgpr4, $vgpr1, 0, 0, implicit $exec |
| ; GCN-NEXT: GLOBAL_STORE_DWORD undef $vgpr3_vgpr4, $vgpr0, 4, 0, implicit $exec |
| ; GCN-NEXT: } |
| ; GCN-NEXT: S_NOP 0 |
| ; GCN-NEXT: BUNDLE implicit undef $vgpr3_vgpr4, implicit $vgpr1, implicit $exec, implicit $vgpr0 { |
| ; GCN-NEXT: GLOBAL_STORE_DWORD undef $vgpr3_vgpr4, $vgpr1, 0, 0, implicit $exec |
| ; GCN-NEXT: GLOBAL_STORE_DWORD undef $vgpr3_vgpr4, $vgpr0, 4, 0, implicit $exec |
| ; GCN-NEXT: GLOBAL_STORE_DWORD undef $vgpr3_vgpr4, $vgpr1, 0, 0, implicit $exec |
| ; GCN-NEXT: } |
| ; GCN-NEXT: S_NOP 0 |
| ; GCN-NEXT: $vgpr0 = GLOBAL_LOAD_DWORD undef $vgpr3_vgpr4, 0, 0, implicit $exec |
| ; GCN-NEXT: S_NOP 0 |
| ; GCN-NEXT: GLOBAL_STORE_DWORD undef $vgpr3_vgpr4, $vgpr0, 4, 0, implicit $exec |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr2, implicit-def $vgpr3, implicit $vgpr0, implicit $exec, implicit $vgpr1 { |
| ; GCN-NEXT: $vgpr2 = DS_READ_B32_gfx9 $vgpr0, 0, 0, implicit $exec |
| ; GCN-NEXT: $vgpr3 = DS_READ_B32_gfx9 $vgpr1, 0, 0, implicit $exec |
| ; GCN-NEXT: } |
| ; GCN-NEXT: BUNDLE implicit $vgpr0, implicit $vgpr2, implicit killed $m0, implicit $exec, implicit $vgpr3 { |
| ; GCN-NEXT: DS_WRITE_B32_gfx9 $vgpr0, $vgpr2, 0, 0, implicit killed $m0, implicit $exec |
| ; GCN-NEXT: DS_WRITE_B32_gfx9 $vgpr0, $vgpr3, 4, 0, implicit killed $m0, implicit $exec |
| ; GCN-NEXT: } |
| ; GCN-NEXT: S_NOP 0 |
| ; GCN-NEXT: BUNDLE implicit-def $sgpr2, implicit-def $sgpr3, implicit undef $sgpr0_sgpr1, implicit undef $sgpr10 { |
| ; GCN-NEXT: $sgpr2 = S_LOAD_DWORD_IMM undef $sgpr0_sgpr1, 0, 0 |
| ; GCN-NEXT: $sgpr3 = S_LOAD_DWORD_SGPR undef $sgpr0_sgpr1, undef $sgpr10, 0 |
| ; GCN-NEXT: } |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr2, implicit-def $vgpr3, implicit $vgpr0, implicit undef $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr2, implicit $exec, implicit $vgpr1 { |
| ; GCN-NEXT: $vgpr2 = BUFFER_LOAD_DWORD_OFFEN $vgpr0, undef $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr2, 0, 0, 0, implicit $exec |
| ; GCN-NEXT: $vgpr3 = BUFFER_LOAD_DWORD_OFFEN $vgpr1, undef $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr2, 0, 0, 0, implicit $exec |
| ; GCN-NEXT: } |
| ; GCN-NEXT: BUNDLE implicit $vgpr0, implicit $vgpr2_vgpr3, implicit undef $sgpr0_sgpr1_sgpr2_sgpr3, implicit $exec { |
| ; GCN-NEXT: BUFFER_STORE_DWORD_ADDR64 $vgpr0, $vgpr2_vgpr3, undef $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec |
| ; GCN-NEXT: BUFFER_STORE_DWORD_ADDR64 $vgpr0, $vgpr2_vgpr3, undef $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec |
| ; GCN-NEXT: } |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr2, implicit-def $vgpr3, implicit undef $vgpr4_vgpr5_vgpr6_vgpr7, implicit undef $sgpr0_sgpr1_sgpr2_sgpr3_sgpr4_sgpr5_sgpr6_sgpr7, implicit $exec { |
| ; GCN-NEXT: $vgpr2 = IMAGE_LOAD_V1_V4 undef $vgpr4_vgpr5_vgpr6_vgpr7, undef $sgpr0_sgpr1_sgpr2_sgpr3_sgpr4_sgpr5_sgpr6_sgpr7, 2, -1, 0, 0, 0, 0, 0, 0, implicit $exec :: (load (s32)) |
| ; GCN-NEXT: $vgpr3 = IMAGE_LOAD_V1_V4 undef $vgpr4_vgpr5_vgpr6_vgpr7, undef $sgpr0_sgpr1_sgpr2_sgpr3_sgpr4_sgpr5_sgpr6_sgpr7, 2, -1, 0, 0, 0, 0, 0, 0, implicit $exec :: (load (s32)) |
| ; GCN-NEXT: } |
| ; GCN-NEXT: BUNDLE implicit undef $vgpr0_vgpr1_vgpr2_vgpr3, implicit $vgpr0_vgpr1, implicit undef $sgpr0_sgpr1_sgpr2_sgpr3_sgpr4_sgpr5_sgpr6_sgpr7, implicit $exec { |
| ; GCN-NEXT: IMAGE_STORE_V4_V2 undef $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr0_vgpr1, undef $sgpr0_sgpr1_sgpr2_sgpr3_sgpr4_sgpr5_sgpr6_sgpr7, 15, -1, 1, 0, 0, 0, 0, 0, implicit $exec :: (store (s128)) |
| ; GCN-NEXT: IMAGE_STORE_V4_V2 undef $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr0_vgpr1, undef $sgpr0_sgpr1_sgpr2_sgpr3_sgpr4_sgpr5_sgpr6_sgpr7, 15, -1, 1, 0, 0, 0, 0, 0, implicit $exec :: (store (s128)) |
| ; GCN-NEXT: } |
| ; GCN-NEXT: S_NOP 0 |
| ; GCN-NEXT: $sgpr64_sgpr65_sgpr66_sgpr67_sgpr68_sgpr69_sgpr70_sgpr71 = S_LOAD_DWORDX8_IMM undef $sgpr10_sgpr11, 464, 0 |
| ; GCN-NEXT: $sgpr68_sgpr69_sgpr70_sgpr71_sgpr72_sgpr73_sgpr74_sgpr75 = S_LOAD_DWORDX8_IMM undef $sgpr10_sgpr11, 128, 0 |
| ; GCN-NEXT: S_NOP 0 |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr2, implicit-def $vgpr3, implicit $vgpr0, implicit $exec, implicit $vgpr1 { |
| ; GCN-NEXT: $vgpr2 = DS_READ_B32_gfx9 $vgpr0, 0, 0, implicit $exec |
| ; GCN-NEXT: $vgpr3 = DS_READ_B32_gfx9 $vgpr1, 0, 0, implicit $exec |
| ; GCN-NEXT: } |
| $vgpr0 = GLOBAL_LOAD_DWORD undef $vgpr3_vgpr4, 0, 0, implicit $exec |
| S_NOP 0 |
| $vgpr0 = GLOBAL_LOAD_DWORD undef $vgpr3_vgpr4, 0, 0, implicit $exec |
| $vgpr1 = GLOBAL_LOAD_DWORD undef $vgpr3_vgpr4, 4, 0, implicit $exec |
| S_NOP 0 |
| $vgpr0 = GLOBAL_LOAD_DWORD undef $vgpr3_vgpr4, 0, 0, implicit $exec |
| $vgpr1 = GLOBAL_LOAD_DWORD undef $vgpr0_vgpr1, 4, 0, implicit $exec |
| $vgpr2 = GLOBAL_LOAD_DWORD undef $vgpr3_vgpr4, 4, 0, implicit $exec |
| $vgpr5 = GLOBAL_LOAD_DWORD undef $vgpr3_vgpr4, 0, 0, implicit $exec |
| GLOBAL_STORE_DWORD undef $vgpr3_vgpr4, $vgpr1, 0, 0, implicit $exec |
| GLOBAL_STORE_DWORD undef $vgpr3_vgpr4, $vgpr0, 4, 0, implicit $exec |
| S_NOP 0 |
| GLOBAL_STORE_DWORD undef $vgpr3_vgpr4, $vgpr1, 0, 0, implicit $exec |
| GLOBAL_STORE_DWORD undef $vgpr3_vgpr4, $vgpr0, 4, 0, implicit $exec |
| GLOBAL_STORE_DWORD undef $vgpr3_vgpr4, $vgpr1, 0, 0, implicit $exec |
| S_NOP 0 |
| $vgpr0 = GLOBAL_LOAD_DWORD undef $vgpr3_vgpr4, 0, 0, implicit $exec |
| S_NOP 0 |
| GLOBAL_STORE_DWORD undef $vgpr3_vgpr4, $vgpr0, 4, 0, implicit $exec |
| $vgpr2 = DS_READ_B32_gfx9 $vgpr0, 0, 0, implicit $exec |
| $vgpr3 = DS_READ_B32_gfx9 $vgpr1, 0, 0, implicit $exec |
| DS_WRITE_B32_gfx9 $vgpr0, $vgpr2, 0, 0, implicit killed $m0, implicit $exec |
| DS_WRITE_B32_gfx9 $vgpr0, $vgpr3, 4, 0, implicit killed $m0, implicit $exec |
| S_NOP 0 |
| $sgpr2 = S_LOAD_DWORD_IMM undef $sgpr0_sgpr1, 0, 0 |
| $sgpr3 = S_LOAD_DWORD_SGPR undef $sgpr0_sgpr1, undef $sgpr10, 0 |
| $vgpr2 = BUFFER_LOAD_DWORD_OFFEN $vgpr0, undef $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr2, 0, 0, 0, implicit $exec |
| $vgpr3 = BUFFER_LOAD_DWORD_OFFEN $vgpr1, undef $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr2, 0, 0, 0, implicit $exec |
| BUFFER_STORE_DWORD_ADDR64 $vgpr0, $vgpr2_vgpr3, undef $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec |
| BUFFER_STORE_DWORD_ADDR64 $vgpr0, $vgpr2_vgpr3, undef $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec |
| $vgpr2 = IMAGE_LOAD_V1_V4 undef $vgpr4_vgpr5_vgpr6_vgpr7, undef $sgpr0_sgpr1_sgpr2_sgpr3_sgpr4_sgpr5_sgpr6_sgpr7, 2, -1, 0, 0, 0, 0, 0, 0, implicit $exec :: (load (s32)) |
| $vgpr3 = IMAGE_LOAD_V1_V4 undef $vgpr4_vgpr5_vgpr6_vgpr7, undef $sgpr0_sgpr1_sgpr2_sgpr3_sgpr4_sgpr5_sgpr6_sgpr7, 2, -1, 0, 0, 0, 0, 0, 0, implicit $exec :: (load (s32)) |
| IMAGE_STORE_V4_V2 undef $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr0_vgpr1, undef $sgpr0_sgpr1_sgpr2_sgpr3_sgpr4_sgpr5_sgpr6_sgpr7, 15, -1, 1, 0, 0, 0, 0, 0, implicit $exec :: (store (s128)) |
| IMAGE_STORE_V4_V2 undef $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr0_vgpr1, undef $sgpr0_sgpr1_sgpr2_sgpr3_sgpr4_sgpr5_sgpr6_sgpr7, 15, -1, 1, 0, 0, 0, 0, 0, implicit $exec :: (store (s128)) |
| S_NOP 0 |
| $sgpr64_sgpr65_sgpr66_sgpr67_sgpr68_sgpr69_sgpr70_sgpr71 = S_LOAD_DWORDX8_IMM undef $sgpr10_sgpr11, 464, 0 |
| $sgpr68_sgpr69_sgpr70_sgpr71_sgpr72_sgpr73_sgpr74_sgpr75 = S_LOAD_DWORDX8_IMM undef $sgpr10_sgpr11, 128, 0 |
| S_NOP 0 |
| $vgpr2 = DS_READ_B32_gfx9 $vgpr0, 0, 0, implicit $exec |
| $vgpr3 = DS_READ_B32_gfx9 $vgpr1, 0, 0, implicit $exec |
| ... |
| |
| # Middle dbg_value should be bundled |
| --- |
| name: bundle_dbg_value_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| ; GCN-LABEL: name: bundle_dbg_value_0 |
| ; GCN: liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr0, implicit-def $vgpr1, implicit $vgpr3_vgpr4, implicit $exec, implicit $vgpr5_vgpr6 { |
| ; GCN-NEXT: $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| ; GCN-NEXT: DBG_VALUE $vgpr0, 0, 0 |
| ; GCN-NEXT: $vgpr1 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| ; GCN-NEXT: } |
| $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| DBG_VALUE $vgpr0, 0, 0 |
| $vgpr1 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| |
| ... |
| |
| # Middle dbg_value should be bundled |
| --- |
| name: bundle_dbg_value_1 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr3_vgpr4, $vgpr5_vgpr6, $vgpr1 |
| ; GCN-LABEL: name: bundle_dbg_value_1 |
| ; GCN: liveins: $vgpr3_vgpr4, $vgpr5_vgpr6, $vgpr1 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr0, implicit-def $vgpr2, implicit $vgpr3_vgpr4, implicit $exec, implicit $vgpr5_vgpr6 { |
| ; GCN-NEXT: $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| ; GCN-NEXT: DBG_VALUE $vgpr0, 0, 0 |
| ; GCN-NEXT: DBG_VALUE $vgpr1, 0, 0 |
| ; GCN-NEXT: $vgpr2 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| ; GCN-NEXT: } |
| ; GCN-NEXT: DBG_VALUE $vgpr2, 0, 0 |
| $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| DBG_VALUE $vgpr0, 0, 0 |
| DBG_VALUE $vgpr1, 0, 0 |
| $vgpr2 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| DBG_VALUE $vgpr2, 0, 0 |
| ... |
| |
| # Starting and ending dbg_values should not be in the bundle |
| --- |
| name: bundle_dbg_value_2 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr3_vgpr4, $vgpr5_vgpr6, $vgpr1 |
| ; GCN-LABEL: name: bundle_dbg_value_2 |
| ; GCN: liveins: $vgpr3_vgpr4, $vgpr5_vgpr6, $vgpr1 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: DBG_VALUE $vgpr1, 0, 0 |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr0, implicit-def $vgpr2, implicit $vgpr3_vgpr4, implicit $exec, implicit $vgpr5_vgpr6 { |
| ; GCN-NEXT: $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| ; GCN-NEXT: DBG_VALUE $vgpr0, 0, 0 |
| ; GCN-NEXT: $vgpr2 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| ; GCN-NEXT: } |
| ; GCN-NEXT: DBG_VALUE $vgpr2, 0, 0 |
| DBG_VALUE $vgpr1, 0, 0 |
| $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| DBG_VALUE $vgpr0, 0, 0 |
| $vgpr2 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| DBG_VALUE $vgpr2, 0, 0 |
| ... |
| |
| --- |
| name: bundle_kill |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| ; GCN-LABEL: name: bundle_kill |
| ; GCN: liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: $vgpr1 = V_MOV_B32_e32 0, implicit $exec |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr0, implicit-def $vgpr2, implicit $vgpr3_vgpr4, implicit $exec, implicit $vgpr1, implicit $vgpr5_vgpr6 { |
| ; GCN-NEXT: $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| ; GCN-NEXT: KILL $vgpr1 |
| ; GCN-NEXT: $vgpr2 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| ; GCN-NEXT: } |
| $vgpr1 = V_MOV_B32_e32 0, implicit $exec |
| $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| KILL $vgpr1 |
| $vgpr2 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| |
| ... |
| |
| --- |
| name: bundle_kill_def_in_bundle |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| ; GCN-LABEL: name: bundle_kill_def_in_bundle |
| ; GCN: liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: $vgpr1 = V_MOV_B32_e32 0, implicit $exec |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr0, implicit-def $vgpr2, implicit $vgpr3_vgpr4, implicit $exec, implicit $vgpr5_vgpr6 { |
| ; GCN-NEXT: $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| ; GCN-NEXT: KILL internal $vgpr0 |
| ; GCN-NEXT: $vgpr2 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| ; GCN-NEXT: } |
| $vgpr1 = V_MOV_B32_e32 0, implicit $exec |
| $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| KILL $vgpr0 |
| $vgpr2 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| |
| ... |
| |
| # Before register allocation, KILL hints are inserted after potential soft |
| # clauses to hint the register allocator to not clobber the input |
| # registers. Kills that look like this should be erased. |
| --- |
| name: post_bundle_kill |
| body: | |
| bb.0: |
| liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| |
| ; GCN-LABEL: name: post_bundle_kill |
| ; GCN: liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr0, implicit-def $vgpr1, implicit $vgpr3_vgpr4, implicit $exec, implicit $vgpr5_vgpr6 { |
| ; GCN-NEXT: $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| ; GCN-NEXT: $vgpr1 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| ; GCN-NEXT: } |
| $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| $vgpr1 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| KILL killed $vgpr3_vgpr4, killed $vgpr5_vgpr6 |
| ... |
| |
| # Kill some other register not used in the bundle, should not be touched. |
| --- |
| name: post_bundle_kill_other |
| body: | |
| bb.0: |
| liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| ; GCN-LABEL: name: post_bundle_kill_other |
| ; GCN: liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: $vgpr7 = V_MOV_B32_e32 0, implicit $exec |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr0, implicit-def $vgpr1, implicit $vgpr3_vgpr4, implicit $exec, implicit $vgpr5_vgpr6 { |
| ; GCN-NEXT: $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| ; GCN-NEXT: $vgpr1 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| ; GCN-NEXT: } |
| ; GCN-NEXT: KILL killed $vgpr7 |
| $vgpr7 = V_MOV_B32_e32 0, implicit $exec |
| $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| $vgpr1 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| KILL killed $vgpr7 |
| ... |
| |
| # Kill some other register not used in the bundle, but also some |
| # from the bundle. |
| --- |
| name: post_bundle_kill_plus_other |
| body: | |
| bb.0: |
| liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| ; GCN-LABEL: name: post_bundle_kill_plus_other |
| ; GCN: liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: $vgpr7 = V_MOV_B32_e32 0, implicit $exec |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr0, implicit-def $vgpr1, implicit $vgpr3_vgpr4, implicit $exec, implicit $vgpr5_vgpr6 { |
| ; GCN-NEXT: $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| ; GCN-NEXT: $vgpr1 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| ; GCN-NEXT: } |
| ; GCN-NEXT: KILL killed $vgpr7, killed $vgpr3 |
| $vgpr7 = V_MOV_B32_e32 0, implicit $exec |
| $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| $vgpr1 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| KILL killed $vgpr7, killed $vgpr3 |
| ... |
| |
| --- |
| name: post_bundle_multi_kill_0 |
| body: | |
| bb.0: |
| liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| |
| ; GCN-LABEL: name: post_bundle_multi_kill_0 |
| ; GCN: liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr0, implicit-def $vgpr1, implicit $vgpr3_vgpr4, implicit $exec, implicit $vgpr5_vgpr6 { |
| ; GCN-NEXT: $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| ; GCN-NEXT: $vgpr1 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| ; GCN-NEXT: } |
| $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| $vgpr1 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| KILL killed $vgpr3_vgpr4 |
| KILL killed $vgpr5_vgpr6 |
| ... |
| |
| |
| --- |
| name: post_bundle_multi_kill_1 |
| body: | |
| bb.0: |
| liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| |
| ; GCN-LABEL: name: post_bundle_multi_kill_1 |
| ; GCN: liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr0, implicit-def $vgpr1, implicit $vgpr3_vgpr4, implicit $exec, implicit $vgpr5_vgpr6 { |
| ; GCN-NEXT: $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| ; GCN-NEXT: $vgpr1 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| ; GCN-NEXT: } |
| $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| $vgpr1 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| KILL killed $vgpr3 |
| KILL $vgpr4 |
| KILL killed $vgpr5 |
| KILL killed $vgpr6 |
| ... |
| |
| --- |
| name: post_bundle_kill_and_null_reg_dbginfo |
| body: | |
| bb.0: |
| liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| |
| ; GCN-LABEL: name: post_bundle_kill_and_null_reg_dbginfo |
| ; GCN: liveins: $vgpr3_vgpr4, $vgpr5_vgpr6 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr0, implicit-def $vgpr1, implicit $vgpr3_vgpr4, implicit $exec, implicit $vgpr5_vgpr6 { |
| ; GCN-NEXT: $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| ; GCN-NEXT: DBG_VALUE $noreg, $noreg |
| ; GCN-NEXT: $vgpr1 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| ; GCN-NEXT: } |
| $vgpr0 = GLOBAL_LOAD_DWORD $vgpr3_vgpr4, 0, 0, implicit $exec |
| DBG_VALUE $noreg, $noreg |
| $vgpr1 = GLOBAL_LOAD_DWORD $vgpr5_vgpr6, 0, 0, implicit $exec |
| KILL killed $vgpr3_vgpr4, killed $vgpr5_vgpr6 |
| ... |
| |
| # Avoid bundling if a MBB has SCHED_BARRIER |
| --- |
| name: no_sched_barrier_within_bundle |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| ; GCN-LABLE: name: no_sched_barrier_within_bundle |
| ; GCN: renamable $sgpr0_sgpr1 = IMPLICIT_DEF |
| ; GCN-NEXT: renamable $vgpr0 = IMPLICIT_DEF |
| ; GCN-NEXT: BUNDLE implicit-def $vgpr1, implicit-def $vgpr1_lo16, implicit-def $vgpr1_hi16, implicit-def $vgpr2, implicit-def $vgpr2_lo16, implicit-def $vgpr2_hi16, implicit $sgpr0_sgpr1, implicit $vgpr0, implicit $exec { |
| ; GCN-NEXT: renamable $vgpr1 = GLOBAL_LOAD_DWORD_SADDR renamable $sgpr0_sgpr1, renamable $vgpr0, 0, 0, implicit $exec, implicit-def $vgpr1, implicit-def $vgpr1_lo16, implicit-def $vgpr1_hi16, implicit-def $vgpr2 |
| ; GCN-NEXT: renamable $vgpr2 = GLOBAL_LOAD_DWORD_SADDR renamable $sgpr0_sgpr1, renamable $vgpr0, 512, 0, implicit $exec, implicit-def $vgpr2_lo16, implicit-def $vgpr2_hi16, implicit $sgpr0_sgpr1, implicit $vgpr0 |
| ; GCN-NEXT: } |
| ; GCN-NEXT: renamable $sgpr2_sgpr3 = IMPLICIT_DEF |
| ; GCN-NEXT: renamable $vgpr10 = IMPLICIT_DEF |
| ; GCN-NEXT: renamable $vgpr1 = nsw V_MUL_LO_U32_e64 killed $vgpr1, $vgpr1, implicit $exec |
| ; GCN-NEXT: renamable $vgpr2 = nsw V_MUL_LO_U32_e64 killed $vgpr2, $vgpr2, implicit $exec |
| ; GCN-NEXT: SCHED_BARRIER 1924 |
| ; GCN-NEXT: renamable $vgpr11 = GLOBAL_LOAD_DWORD_SADDR renamable $sgpr2_sgpr3, renamable $vgpr10, 0, 0, implicit $exec, implicit-def $vgpr11, implicit-def $vgpr11_lo16, implicit-def $vgpr11_hi16, implicit $sgpr2_sgpr3, implicit $vgpr10 |
| ; GCN-NEXT: SCHED_BARRIER 1924 |
| ; GCN-NEXT: renamable $vgpr12 = GLOBAL_LOAD_DWORD_SADDR renamable $sgpr2_sgpr3, renamable $vgpr10, 512, 0, implicit $exec, implicit-def $vgpr12, implicit-def $vgpr12_lo16, implicit-def $vgpr12_hi16, implicit $sgpr2_sgpr3, implicit $vgpr10 |
| ; GCN-NEXT: renamable $sgpr4_sgpr5 = IMPLICIT_DEF |
| ; GCN-NEXT: renamable $vgpr0 = IMPLICIT_DEF |
| ; GCN-NEXT: renamable $vgpr11 = nsw V_MUL_LO_U32_e64 killed $vgpr11, $vgpr11, implicit $exec |
| ; GCN-NEXT: renamable $vgpr12 = nsw V_MUL_LO_U32_e64 killed $vgpr12, $vgpr12, implicit $exec |
| ; GCN-NEXT: BUNDLE implicit killed $vgpr10, implicit killed $vgpr11, implicit killed $sgpr2_sgpr3, implicit $exec, implicit killed $vgpr12, implicit killed $vgpr0, implicit killed $vgpr1, implicit killed $sgpr4_sgpr5, implicit killed $vgpr2 { |
| ; GCN-NEXT: GLOBAL_STORE_DWORD_SADDR renamable $vgpr10, killed renamable $vgpr11, renamable $sgpr2_sgpr3, 0, 0, implicit $exec, implicit killed $vgpr11 |
| ; GCN-NEXT: GLOBAL_STORE_DWORD_SADDR killed renamable $vgpr10, killed renamable $vgpr12, killed renamable $sgpr2_sgpr3, 512, 0, implicit $exec |
| ; GCN-NEXT: GLOBAL_STORE_DWORD_SADDR renamable $vgpr0, killed renamable $vgpr1, renamable $sgpr4_sgpr5, 0, 0, implicit $exec |
| ; GCN-NEXT: GLOBAL_STORE_DWORD_SADDR killed renamable $vgpr0, killed renamable $vgpr2, killed renamable $sgpr4_sgpr5, 512, 0, implicit $exec |
| ; GCN-NEXT: } |
| ; GCN-NEXT: S_ENDPGM 0 |
| renamable $sgpr0_sgpr1 = IMPLICIT_DEF |
| renamable $vgpr0 = IMPLICIT_DEF |
| renamable $vgpr1 = GLOBAL_LOAD_DWORD_SADDR renamable $sgpr0_sgpr1, renamable $vgpr0, 0, 0, implicit $exec, implicit-def $vgpr1, implicit-def $vgpr1_lo16, implicit-def $vgpr1_hi16, implicit-def $vgpr2 |
| renamable $vgpr2 = GLOBAL_LOAD_DWORD_SADDR renamable $sgpr0_sgpr1, renamable $vgpr0, 512, 0, implicit $exec, implicit-def $vgpr2_lo16, implicit-def $vgpr2_hi16, implicit $sgpr0_sgpr1, implicit $vgpr0 |
| renamable $sgpr2_sgpr3 = IMPLICIT_DEF |
| renamable $vgpr10 = IMPLICIT_DEF |
| renamable $vgpr1 = nsw V_MUL_LO_U32_e64 killed $vgpr1, $vgpr1, implicit $exec |
| renamable $vgpr2 = nsw V_MUL_LO_U32_e64 killed $vgpr2, $vgpr2, implicit $exec |
| SCHED_BARRIER 1924 |
| renamable $vgpr11 = GLOBAL_LOAD_DWORD_SADDR renamable $sgpr2_sgpr3, renamable $vgpr10, 0, 0, implicit $exec, implicit-def $vgpr11, implicit-def $vgpr11_lo16, implicit-def $vgpr11_hi16, implicit $sgpr2_sgpr3, implicit $vgpr10 |
| SCHED_BARRIER 1924 |
| renamable $vgpr12 = GLOBAL_LOAD_DWORD_SADDR renamable $sgpr2_sgpr3, renamable $vgpr10, 512, 0, implicit $exec, implicit-def $vgpr12, implicit-def $vgpr12_lo16, implicit-def $vgpr12_hi16, implicit $sgpr2_sgpr3, implicit $vgpr10 |
| renamable $sgpr4_sgpr5 = IMPLICIT_DEF |
| renamable $vgpr0 = IMPLICIT_DEF |
| renamable $vgpr11 = nsw V_MUL_LO_U32_e64 killed $vgpr11, $vgpr11, implicit $exec |
| renamable $vgpr12 = nsw V_MUL_LO_U32_e64 killed $vgpr12, $vgpr12, implicit $exec |
| GLOBAL_STORE_DWORD_SADDR renamable $vgpr10, killed renamable $vgpr11, renamable $sgpr2_sgpr3, 0, 0, implicit $exec, implicit killed $vgpr11 |
| GLOBAL_STORE_DWORD_SADDR killed renamable $vgpr10, killed renamable $vgpr12, killed renamable $sgpr2_sgpr3, 512, 0, implicit $exec |
| GLOBAL_STORE_DWORD_SADDR renamable $vgpr0, killed renamable $vgpr1, renamable $sgpr4_sgpr5, 0, 0, implicit $exec |
| GLOBAL_STORE_DWORD_SADDR killed renamable $vgpr0, killed renamable $vgpr2, killed renamable $sgpr4_sgpr5, 512, 0, implicit $exec |
| S_ENDPGM 0 |
| ... |