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