1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -verify-machineinstrs -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -run-pass=regallocfast -o - %s | FileCheck -check-prefix=GCN %s 3# RUN: llc -verify-machineinstrs -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -passes=regallocfast -o - %s | FileCheck -check-prefix=GCN %s 4 5--- 6name: self_loop_single_def_use 7tracksRegLiveness: true 8machineFunctionInfo: 9 isEntryFunction: true 10 scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3' 11 stackPtrOffsetReg: '$sgpr32' 12body: | 13 ; GCN-LABEL: name: self_loop_single_def_use 14 ; GCN: bb.0: 15 ; GCN-NEXT: successors: %bb.1(0x80000000) 16 ; GCN-NEXT: liveins: $vgpr0_vgpr1 17 ; GCN-NEXT: {{ $}} 18 ; GCN-NEXT: SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr32, 0, implicit $exec :: (store (s64) into %stack.0, align 4, addrspace 5) 19 ; GCN-NEXT: {{ $}} 20 ; GCN-NEXT: bb.1: 21 ; GCN-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000) 22 ; GCN-NEXT: {{ $}} 23 ; GCN-NEXT: $vgpr0_vgpr1 = SI_SPILL_V64_RESTORE %stack.0, $sgpr32, 0, implicit $exec :: (load (s64) from %stack.0, align 4, addrspace 5) 24 ; GCN-NEXT: renamable $vgpr2 = GLOBAL_LOAD_DWORD renamable $vgpr0_vgpr1, 0, 0, implicit $exec 25 ; GCN-NEXT: GLOBAL_STORE_DWORD renamable $vgpr0_vgpr1, killed renamable $vgpr2, 0, 0, implicit $exec 26 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec 27 ; GCN-NEXT: {{ $}} 28 ; GCN-NEXT: bb.2: 29 ; GCN-NEXT: S_ENDPGM 0 30 bb.0: 31 liveins: $vgpr0_vgpr1 32 %0:vreg_64 = COPY $vgpr0_vgpr1 33 34 bb.1: 35 %1:vgpr_32 = GLOBAL_LOAD_DWORD %0, 0, 0, implicit $exec 36 GLOBAL_STORE_DWORD %0, %1, 0, 0, implicit $exec 37 S_CBRANCH_EXECZ %bb.1, implicit $exec 38 39 bb.2: 40 S_ENDPGM 0 41 42... 43 44--- 45name: self_loop_multi_def 46tracksRegLiveness: true 47machineFunctionInfo: 48 isEntryFunction: true 49 scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3' 50 stackPtrOffsetReg: '$sgpr32' 51body: | 52 ; GCN-LABEL: name: self_loop_multi_def 53 ; GCN: bb.0: 54 ; GCN-NEXT: successors: %bb.1(0x80000000) 55 ; GCN-NEXT: liveins: $vgpr0_vgpr1 56 ; GCN-NEXT: {{ $}} 57 ; GCN-NEXT: SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr32, 0, implicit $exec :: (store (s64) into %stack.0, align 4, addrspace 5) 58 ; GCN-NEXT: {{ $}} 59 ; GCN-NEXT: bb.1: 60 ; GCN-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000) 61 ; GCN-NEXT: {{ $}} 62 ; GCN-NEXT: $vgpr0_vgpr1 = SI_SPILL_V64_RESTORE %stack.0, $sgpr32, 0, implicit $exec :: (load (s64) from %stack.0, align 4, addrspace 5) 63 ; GCN-NEXT: renamable $vgpr2 = GLOBAL_LOAD_DWORD renamable $vgpr0_vgpr1, 0, 0, implicit $exec 64 ; GCN-NEXT: GLOBAL_STORE_DWORD renamable $vgpr0_vgpr1, renamable $vgpr2, 0, 0, implicit $exec 65 ; GCN-NEXT: renamable $vgpr2 = GLOBAL_LOAD_DWORD renamable $vgpr0_vgpr1, 0, 0, implicit $exec 66 ; GCN-NEXT: GLOBAL_STORE_DWORD renamable $vgpr0_vgpr1, killed renamable $vgpr2, 0, 0, implicit $exec 67 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec 68 ; GCN-NEXT: {{ $}} 69 ; GCN-NEXT: bb.2: 70 ; GCN-NEXT: S_ENDPGM 0 71 72 bb.0: 73 liveins: $vgpr0_vgpr1 74 %0:vreg_64 = COPY $vgpr0_vgpr1 75 76 bb.1: 77 %1:vgpr_32 = GLOBAL_LOAD_DWORD %0, 0, 0, implicit $exec 78 GLOBAL_STORE_DWORD %0, %1, 0, 0, implicit $exec 79 %1:vgpr_32 = GLOBAL_LOAD_DWORD %0, 0, 0, implicit $exec 80 GLOBAL_STORE_DWORD %0, %1, 0, 0, implicit $exec 81 S_CBRANCH_EXECZ %bb.1, implicit $exec 82 83 bb.2: 84 S_ENDPGM 0 85 86... 87 88# There's a single def inside the self loop, but it's also a use. 89 90--- 91name: self_loop_def_use_same_inst 92tracksRegLiveness: true 93machineFunctionInfo: 94 isEntryFunction: true 95 scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3' 96 stackPtrOffsetReg: '$sgpr32' 97body: | 98 ; GCN-LABEL: name: self_loop_def_use_same_inst 99 ; GCN: bb.0: 100 ; GCN-NEXT: successors: %bb.1(0x80000000) 101 ; GCN-NEXT: liveins: $vgpr0_vgpr1 102 ; GCN-NEXT: {{ $}} 103 ; GCN-NEXT: SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr32, 0, implicit $exec :: (store (s64) into %stack.0, align 4, addrspace 5) 104 ; GCN-NEXT: {{ $}} 105 ; GCN-NEXT: bb.1: 106 ; GCN-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000) 107 ; GCN-NEXT: {{ $}} 108 ; GCN-NEXT: $vgpr0_vgpr1 = SI_SPILL_V64_RESTORE %stack.0, $sgpr32, 0, implicit $exec :: (load (s64) from %stack.0, align 4, addrspace 5) 109 ; GCN-NEXT: renamable $vgpr2 = V_ADD_U32_e32 1, undef $vgpr0, implicit $exec 110 ; GCN-NEXT: SI_SPILL_V32_SAVE $vgpr2, %stack.1, $sgpr32, 0, implicit $exec :: (store (s32) into %stack.1, addrspace 5) 111 ; GCN-NEXT: GLOBAL_STORE_DWORD renamable $vgpr0_vgpr1, renamable $vgpr2, 0, 0, implicit $exec 112 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec 113 ; GCN-NEXT: {{ $}} 114 ; GCN-NEXT: bb.2: 115 ; GCN-NEXT: S_ENDPGM 0 116 bb.0: 117 liveins: $vgpr0_vgpr1 118 %0:vreg_64 = COPY $vgpr0_vgpr1 119 120 bb.1: 121 %1:vgpr_32 = V_ADD_U32_e32 1, undef %1, implicit $exec 122 GLOBAL_STORE_DWORD %0, %1, 0, 0, implicit $exec 123 S_CBRANCH_EXECZ %bb.1, implicit $exec 124 125 bb.2: 126 S_ENDPGM 0 127 128... 129 130--- 131name: self_loop_def_after_use 132tracksRegLiveness: true 133machineFunctionInfo: 134 isEntryFunction: true 135 scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3' 136 stackPtrOffsetReg: '$sgpr32' 137body: | 138 ; GCN-LABEL: name: self_loop_def_after_use 139 ; GCN: bb.0: 140 ; GCN-NEXT: successors: %bb.1(0x80000000) 141 ; GCN-NEXT: liveins: $vgpr0_vgpr1 142 ; GCN-NEXT: {{ $}} 143 ; GCN-NEXT: SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr32, 0, implicit $exec :: (store (s64) into %stack.0, align 4, addrspace 5) 144 ; GCN-NEXT: {{ $}} 145 ; GCN-NEXT: bb.1: 146 ; GCN-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000) 147 ; GCN-NEXT: {{ $}} 148 ; GCN-NEXT: $vgpr0_vgpr1 = SI_SPILL_V64_RESTORE %stack.0, $sgpr32, 0, implicit $exec :: (load (s64) from %stack.0, align 4, addrspace 5) 149 ; GCN-NEXT: GLOBAL_STORE_DWORD renamable $vgpr0_vgpr1, undef renamable $vgpr0, 0, 0, implicit $exec 150 ; GCN-NEXT: renamable $vgpr0 = V_ADD_U32_e64 1, 1, 0, implicit $exec 151 ; GCN-NEXT: SI_SPILL_V32_SAVE killed $vgpr0, %stack.1, $sgpr32, 0, implicit $exec :: (store (s32) into %stack.1, addrspace 5) 152 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec 153 ; GCN-NEXT: {{ $}} 154 ; GCN-NEXT: bb.2: 155 ; GCN-NEXT: S_ENDPGM 0 156 bb.0: 157 liveins: $vgpr0_vgpr1 158 %0:vreg_64 = COPY $vgpr0_vgpr1 159 160 bb.1: 161 GLOBAL_STORE_DWORD %0, undef %1, 0, 0, implicit $exec 162 %1:vgpr_32 = V_ADD_U32_e64 1, 1, 0, implicit $exec 163 S_CBRANCH_EXECZ %bb.1, implicit $exec 164 165 bb.2: 166 S_ENDPGM 0 167 168... 169 170--- 171name: self_loop_single_subreg_def_use 172tracksRegLiveness: true 173machineFunctionInfo: 174 isEntryFunction: true 175 scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3' 176 stackPtrOffsetReg: '$sgpr32' 177body: | 178 ; GCN-LABEL: name: self_loop_single_subreg_def_use 179 ; GCN: bb.0: 180 ; GCN-NEXT: successors: %bb.1(0x80000000) 181 ; GCN-NEXT: liveins: $vgpr0_vgpr1 182 ; GCN-NEXT: {{ $}} 183 ; GCN-NEXT: SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr32, 0, implicit $exec :: (store (s64) into %stack.0, align 4, addrspace 5) 184 ; GCN-NEXT: {{ $}} 185 ; GCN-NEXT: bb.1: 186 ; GCN-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000) 187 ; GCN-NEXT: {{ $}} 188 ; GCN-NEXT: $vgpr0_vgpr1 = SI_SPILL_V64_RESTORE %stack.0, $sgpr32, 0, implicit $exec :: (load (s64) from %stack.0, align 4, addrspace 5) 189 ; GCN-NEXT: undef renamable $vgpr3 = GLOBAL_LOAD_DWORD renamable $vgpr0_vgpr1, 0, 0, implicit $exec, implicit-def dead $vgpr2_vgpr3 190 ; GCN-NEXT: GLOBAL_STORE_DWORD renamable $vgpr0_vgpr1, undef renamable $vgpr1, 0, 0, implicit $exec 191 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec 192 ; GCN-NEXT: {{ $}} 193 ; GCN-NEXT: bb.2: 194 ; GCN-NEXT: S_ENDPGM 0 195 bb.0: 196 liveins: $vgpr0_vgpr1 197 %0:vreg_64 = COPY $vgpr0_vgpr1 198 199 bb.1: 200 undef %1.sub1:vreg_64 = GLOBAL_LOAD_DWORD %0, 0, 0, implicit $exec 201 GLOBAL_STORE_DWORD %0, undef %1.sub1, 0, 0, implicit $exec 202 S_CBRANCH_EXECZ %bb.1, implicit $exec 203 204 bb.2: 205 S_ENDPGM 0 206 207... 208