1# RUN: llc -march=amdgcn -mcpu=gfx900 -run-pass=si-late-branch-lowering -verify-machineinstrs %s -o - | FileCheck -check-prefixes=GCN,GFX9 %s 2# RUN: llc -march=amdgcn -mcpu=gfx1010 -mattr=-wavefrontsize32,+wavefrontsize64 -run-pass=si-late-branch-lowering -verify-machineinstrs %s -o - | FileCheck -check-prefixes=GCN,GFX10 %s 3 4--- | 5 define amdgpu_ps void @early_term_scc0_end_block() { 6 ret void 7 } 8 9 define amdgpu_ps void @early_term_scc0_next_terminator() { 10 ret void 11 } 12 13 define amdgpu_ps void @early_term_scc0_in_block() { 14 ret void 15 } 16 17 define amdgpu_gs void @early_term_scc0_gs() { 18 ret void 19 } 20 21 define amdgpu_cs void @early_term_scc0_cs() { 22 ret void 23 } 24 25 define amdgpu_ps void @early_term_no_export() #0 { 26 ret void 27 } 28 29 attributes #0 = { "amdgpu-color-export"="0" "amdgpu-depth-export"="0" } 30... 31 32--- 33name: early_term_scc0_end_block 34tracksRegLiveness: true 35liveins: 36 - { reg: '$sgpr0' } 37 - { reg: '$sgpr1' } 38body: | 39 ; GCN-LABEL: name: early_term_scc0_end_block 40 ; GCN: bb.0: 41 ; GCN: successors: %bb.1(0x80000000), %bb.2(0x00000000) 42 ; GCN: liveins: $sgpr0, $sgpr1 43 ; GCN: $vgpr0 = V_MOV_B32_e32 0, implicit $exec 44 ; GCN: dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc 45 ; GCN: S_CBRANCH_SCC0 %bb.2, implicit $scc 46 ; GCN: bb.1: 47 ; GCN: liveins: $vgpr0 48 ; GCN: EXP_DONE 0, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec 49 ; GCN: S_ENDPGM 0 50 ; GCN: bb.2: 51 ; GCN: $exec = S_MOV_B64 0 52 ; GCN: EXP_DONE 9, undef $vgpr0, undef $vgpr0, undef $vgpr0, undef $vgpr0, 1, 0, 0, implicit $exec 53 ; GCN: S_ENDPGM 0 54 bb.0: 55 liveins: $sgpr0, $sgpr1 56 successors: %bb.1 57 58 $vgpr0 = V_MOV_B32_e32 0, implicit $exec 59 dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc 60 SI_EARLY_TERMINATE_SCC0 implicit $scc, implicit $exec 61 62 bb.1: 63 liveins: $vgpr0 64 EXP_DONE 0, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec 65 S_ENDPGM 0 66... 67 68--- 69name: early_term_scc0_next_terminator 70tracksRegLiveness: true 71liveins: 72 - { reg: '$sgpr0' } 73 - { reg: '$sgpr1' } 74body: | 75 ; GCN-LABEL: name: early_term_scc0_next_terminator 76 ; GCN: bb.0: 77 ; GCN: successors: %bb.2(0x80000000), %bb.3(0x00000000) 78 ; GCN: liveins: $sgpr0, $sgpr1 79 ; GCN: $vgpr0 = V_MOV_B32_e32 0, implicit $exec 80 ; GCN: dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc 81 ; GCN: S_CBRANCH_SCC0 %bb.3, implicit $scc 82 ; GCN: S_BRANCH %bb.2 83 ; GCN: bb.1: 84 ; GCN: successors: %bb.2(0x80000000) 85 ; GCN: $vgpr0 = V_MOV_B32_e32 1, implicit $exec 86 ; GCN: bb.2: 87 ; GCN: liveins: $vgpr0 88 ; GCN: EXP_DONE 0, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec 89 ; GCN: S_ENDPGM 0 90 ; GCN: bb.3: 91 ; GCN: $exec = S_MOV_B64 0 92 ; GCN: EXP_DONE 9, undef $vgpr0, undef $vgpr0, undef $vgpr0, undef $vgpr0, 1, 0, 0, implicit $exec 93 ; GCN: S_ENDPGM 0 94 bb.0: 95 liveins: $sgpr0, $sgpr1 96 successors: %bb.2 97 98 $vgpr0 = V_MOV_B32_e32 0, implicit $exec 99 dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc 100 SI_EARLY_TERMINATE_SCC0 implicit $scc, implicit $exec 101 S_BRANCH %bb.2 102 103 bb.1: 104 successors: %bb.2 105 $vgpr0 = V_MOV_B32_e32 1, implicit $exec 106 S_BRANCH %bb.2 107 108 bb.2: 109 liveins: $vgpr0 110 EXP_DONE 0, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec 111 S_ENDPGM 0 112... 113 114--- 115name: early_term_scc0_in_block 116tracksRegLiveness: true 117liveins: 118 - { reg: '$sgpr0' } 119 - { reg: '$sgpr1' } 120body: | 121 ; GCN-LABEL: name: early_term_scc0_in_block 122 ; GCN: bb.0: 123 ; GCN: successors: %bb.3(0x40000000), %bb.2(0x40000000) 124 ; GCN: liveins: $sgpr0, $sgpr1 125 ; GCN: $vgpr0 = V_MOV_B32_e32 0, implicit $exec 126 ; GCN: dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc 127 ; GCN: S_CBRANCH_SCC0 %bb.2, implicit $scc 128 ; GCN: bb.3: 129 ; GCN: successors: %bb.1(0x80000000) 130 ; GCN: liveins: $vgpr0, $scc 131 ; GCN: $vgpr1 = V_MOV_B32_e32 1, implicit $exec 132 ; GCN: bb.1: 133 ; GCN: liveins: $vgpr0, $vgpr1 134 ; GCN: EXP 1, $vgpr1, $vgpr1, $vgpr1, $vgpr1, -1, -1, 15, implicit $exec 135 ; GCN: EXP_DONE 0, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec 136 ; GCN: S_ENDPGM 0 137 ; GCN: bb.2: 138 ; GCN: $exec = S_MOV_B64 0 139 ; GCN: EXP_DONE 9, undef $vgpr0, undef $vgpr0, undef $vgpr0, undef $vgpr0, 1, 0, 0, implicit $exec 140 ; GCN: S_ENDPGM 0 141 bb.0: 142 liveins: $sgpr0, $sgpr1 143 successors: %bb.1 144 145 $vgpr0 = V_MOV_B32_e32 0, implicit $exec 146 dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc 147 SI_EARLY_TERMINATE_SCC0 implicit $scc, implicit $exec 148 $vgpr1 = V_MOV_B32_e32 1, implicit $exec 149 150 bb.1: 151 liveins: $vgpr0, $vgpr1 152 EXP 1, $vgpr1, $vgpr1, $vgpr1, $vgpr1, -1, -1, 15, implicit $exec 153 EXP_DONE 0, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec 154 S_ENDPGM 0 155... 156 157--- 158name: early_term_scc0_gs 159tracksRegLiveness: true 160liveins: 161 - { reg: '$sgpr0' } 162 - { reg: '$sgpr1' } 163body: | 164 ; GCN-LABEL: name: early_term_scc0_gs 165 ; GCN: bb.0: 166 ; GCN: successors: %bb.1(0x80000000) 167 ; GCN: liveins: $sgpr0, $sgpr1 168 ; GCN: $vgpr0 = V_MOV_B32_e32 0, implicit $exec 169 ; GCN: dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc 170 ; GCN: bb.1: 171 ; GCN: liveins: $vgpr0 172 ; GCN: S_ENDPGM 0 173 ; GCN: bb.2: 174 ; GCN: $exec = S_MOV_B64 0 175 ; GCN: S_ENDPGM 0 176 bb.0: 177 liveins: $sgpr0, $sgpr1 178 successors: %bb.1 179 180 $vgpr0 = V_MOV_B32_e32 0, implicit $exec 181 dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc 182 SI_EARLY_TERMINATE_SCC0 implicit $scc, implicit $exec 183 184 bb.1: 185 liveins: $vgpr0 186 S_ENDPGM 0 187... 188 189--- 190name: early_term_scc0_cs 191tracksRegLiveness: true 192liveins: 193 - { reg: '$sgpr0' } 194 - { reg: '$sgpr1' } 195body: | 196 ; GCN-LABEL: name: early_term_scc0_cs 197 ; GCN: bb.0: 198 ; GCN: successors: %bb.1(0x80000000), %bb.2(0x00000000) 199 ; GCN: liveins: $sgpr0, $sgpr1 200 ; GCN: $vgpr0 = V_MOV_B32_e32 0, implicit $exec 201 ; GCN: dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc 202 ; GCN: S_CBRANCH_SCC0 %bb.2, implicit $scc 203 ; GCN: bb.1: 204 ; GCN: liveins: $vgpr0 205 ; GCN: S_ENDPGM 0 206 ; GCN: bb.2: 207 ; GCN: $exec = S_MOV_B64 0 208 ; GCN: S_ENDPGM 0 209 bb.0: 210 liveins: $sgpr0, $sgpr1 211 successors: %bb.1 212 213 $vgpr0 = V_MOV_B32_e32 0, implicit $exec 214 dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc 215 SI_EARLY_TERMINATE_SCC0 implicit $scc, implicit $exec 216 217 bb.1: 218 liveins: $vgpr0 219 S_ENDPGM 0 220... 221 222--- 223name: early_term_no_export 224tracksRegLiveness: true 225liveins: 226 - { reg: '$sgpr0' } 227 - { reg: '$sgpr1' } 228body: | 229 ; GCN-LABEL: name: early_term_no_export 230 ; GCN: bb.0: 231 ; GCN: successors: %bb.1(0x80000000), %bb.2(0x00000000) 232 ; GCN: liveins: $sgpr0, $sgpr1 233 ; GCN: $vgpr0 = V_MOV_B32_e32 0, implicit $exec 234 ; GCN: dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc 235 ; GCN: S_CBRANCH_SCC0 %bb.2, implicit $scc 236 ; GCN: bb.1: 237 ; GCN: liveins: $vgpr0 238 ; GCN: EXP_DONE 0, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec 239 ; GCN: S_ENDPGM 0 240 ; GCN: bb.2: 241 ; GCN: $exec = S_MOV_B64 0 242 ; GFX9: EXP_DONE 9, undef $vgpr0, undef $vgpr0, undef $vgpr0, undef $vgpr0, 1, 0, 0, implicit $exec 243 ; GFX10-NOT: EXP_DONE 244 ; GCN: S_ENDPGM 0 245 bb.0: 246 liveins: $sgpr0, $sgpr1 247 successors: %bb.1 248 249 $vgpr0 = V_MOV_B32_e32 0, implicit $exec 250 dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc 251 SI_EARLY_TERMINATE_SCC0 implicit $scc, implicit $exec 252 253 bb.1: 254 liveins: $vgpr0 255 EXP_DONE 0, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec 256 S_ENDPGM 0 257... 258