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