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