| # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py | 
 | # RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -run-pass=greedy -verify-machineinstrs -o - %s |FileCheck %s | 
 |  | 
 | # Testcase is limited to 24 VGPRs. Only a maximum of 6 vreg_128s can | 
 | # be allocated at the same time. | 
 |  | 
 | # This testcase is intended to stress the heuristic in | 
 | # RAGreedy::enqueue to switch from local to global. If an interval is | 
 | # in one basic block, the usual preference is to allocate registers in | 
 | # instruction order. If the estimated live range length is more than | 
 | # twice the number of registers in the class, the global heuristic is | 
 | # used which increases the priority of the longest live ranges. By | 
 | # accounting for the number of reserved registers in vreg_128, the | 
 | # heuristic changes end up avoiding a spill of %0. | 
 |  | 
 | --- | | 
 |  | 
 |   define void @use_global_assign() #0 { | 
 |   entry: | 
 |     unreachable | 
 |   } | 
 |  | 
 |   attributes #0 = { "amdgpu-waves-per-eu"="10,10" } | 
 |  | 
 | ... | 
 | --- | 
 | name: use_global_assign | 
 | tracksRegLiveness: true | 
 | registers: | 
 |   - { id: 0, class: vreg_128, preferred-register: '%0' } | 
 |   - { id: 1, class: vreg_128, preferred-register: '%0' } | 
 |   - { id: 2, class: vreg_128, preferred-register: '%0' } | 
 |   - { id: 3, class: vreg_128, preferred-register: '%0' } | 
 |   - { id: 4, class: vreg_128, preferred-register: '%0' } | 
 |   - { id: 5, class: vreg_128, preferred-register: '%0' } | 
 |   - { id: 6, class: vreg_128, preferred-register: '%0' } | 
 |   - { id: 7, class: vreg_128, preferred-register: '%0' } | 
 |   - { id: 8, class: vreg_128, preferred-register: '%0' } | 
 |   - { id: 9, class: vreg_128, preferred-register: '%0' } | 
 |   - { id: 10, class: vreg_128, preferred-register: '%0' } | 
 |   - { id: 11, class: vreg_128, preferred-register: '%0' } | 
 |   - { id: 12, class: vreg_128, preferred-register: '%0' } | 
 |   - { id: 13, class: vreg_128, preferred-register: '%0' } | 
 |   - { id: 14, class: vreg_128, preferred-register: '%0' } | 
 |   - { id: 15, class: vreg_128, preferred-register: '%0' } | 
 |  | 
 | machineFunctionInfo: | 
 |   waveLimiter:     true | 
 |   scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3' | 
 |   stackPtrOffsetReg: '$sgpr32' | 
 | body:             | | 
 |   ; CHECK-LABEL: name: use_global_assign | 
 |   ; CHECK: bb.0: | 
 |   ; CHECK-NEXT:   successors: %bb.1(0x80000000) | 
 |   ; CHECK-NEXT: {{  $}} | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit-def %0 | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit-def %18 | 
 |   ; CHECK-NEXT:   SI_SPILL_V128_SAVE %18, %stack.0, $sgpr32, 0, implicit $exec :: (store (s128) into %stack.0, align 4, addrspace 5) | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit-def %35 | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit-def %27 | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit-def %29 | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit-def %31 | 
 |   ; CHECK-NEXT: {{  $}} | 
 |   ; CHECK-NEXT: bb.1: | 
 |   ; CHECK-NEXT:   successors: %bb.2(0x80000000) | 
 |   ; CHECK-NEXT: {{  $}} | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit %31 | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit %29 | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit %27 | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit %35 | 
 |   ; CHECK-NEXT:   SI_SPILL_V128_SAVE %35, %stack.1, $sgpr32, 0, implicit $exec :: (store (s128) into %stack.1, align 4, addrspace 5) | 
 |   ; CHECK-NEXT:   [[SI_SPILL_V128_RESTORE:%[0-9]+]]:vreg_128 = SI_SPILL_V128_RESTORE %stack.0, $sgpr32, 0, implicit $exec :: (load (s128) from %stack.0, align 4, addrspace 5) | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit [[SI_SPILL_V128_RESTORE]] | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit %0 | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit-def %10 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit %0 | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit-def %33 | 
 |   ; CHECK-NEXT:   SI_SPILL_V128_SAVE %33, %stack.2, $sgpr32, 0, implicit $exec :: (store (s128) into %stack.2, align 4, addrspace 5) | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit %10 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit-def %40 | 
 |   ; CHECK-NEXT:   SI_SPILL_V128_SAVE %40, %stack.4, $sgpr32, 0, implicit $exec :: (store (s128) into %stack.4, align 4, addrspace 5) | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit %33 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit-def %42 | 
 |   ; CHECK-NEXT:   SI_SPILL_V128_SAVE %42, %stack.3, $sgpr32, 0, implicit $exec :: (store (s128) into %stack.3, align 4, addrspace 5) | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit %40 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   S_NOP 0 | 
 |   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:vreg_128 = COPY %31 | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit %31 | 
 |   ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:vreg_128 = COPY %29 | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit %29 | 
 |   ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:vreg_128 = COPY %27 | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit %27 | 
 |   ; CHECK-NEXT:   [[SI_SPILL_V128_RESTORE1:%[0-9]+]]:vreg_128 = SI_SPILL_V128_RESTORE %stack.1, $sgpr32, 0, implicit $exec :: (load (s128) from %stack.1, align 4, addrspace 5) | 
 |   ; CHECK-NEXT:   [[COPY3:%[0-9]+]]:vreg_128 = COPY [[SI_SPILL_V128_RESTORE1]] | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit [[SI_SPILL_V128_RESTORE1]] | 
 |   ; CHECK-NEXT:   [[SI_SPILL_V128_RESTORE2:%[0-9]+]]:vreg_128 = SI_SPILL_V128_RESTORE %stack.0, $sgpr32, 0, implicit $exec :: (load (s128) from %stack.0, align 4, addrspace 5) | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit [[SI_SPILL_V128_RESTORE2]] | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit %0 | 
 |   ; CHECK-NEXT:   [[SI_SPILL_V128_RESTORE3:%[0-9]+]]:vreg_128 = SI_SPILL_V128_RESTORE %stack.2, $sgpr32, 0, implicit $exec :: (load (s128) from %stack.2, align 4, addrspace 5) | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit [[SI_SPILL_V128_RESTORE3]] | 
 |   ; CHECK-NEXT:   [[SI_SPILL_V128_RESTORE4:%[0-9]+]]:vreg_128 = SI_SPILL_V128_RESTORE %stack.4, $sgpr32, 0, implicit $exec :: (load (s128) from %stack.4, align 4, addrspace 5) | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit [[SI_SPILL_V128_RESTORE4]] | 
 |   ; CHECK-NEXT:   [[SI_SPILL_V128_RESTORE5:%[0-9]+]]:vreg_128 = SI_SPILL_V128_RESTORE %stack.3, $sgpr32, 0, implicit $exec :: (load (s128) from %stack.3, align 4, addrspace 5) | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit [[SI_SPILL_V128_RESTORE5]] | 
 |   ; CHECK-NEXT: {{  $}} | 
 |   ; CHECK-NEXT: bb.2: | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit %0 | 
 |   ; CHECK-NEXT:   [[SI_SPILL_V128_RESTORE6:%[0-9]+]]:vreg_128 = SI_SPILL_V128_RESTORE %stack.0, $sgpr32, 0, implicit $exec :: (load (s128) from %stack.0, align 4, addrspace 5) | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit [[SI_SPILL_V128_RESTORE6]] | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit [[COPY3]] | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit [[COPY2]] | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit [[COPY1]] | 
 |   ; CHECK-NEXT:   S_NOP 0, implicit [[COPY]] | 
 |   bb.0: | 
 |     S_NOP 0, implicit-def %0:vreg_128 | 
 |     S_NOP 0, implicit-def %1:vreg_128 | 
 |     S_NOP 0, implicit-def %2:vreg_128 | 
 |     S_NOP 0, implicit-def %3:vreg_128 | 
 |     S_NOP 0, implicit-def %4:vreg_128 | 
 |     S_NOP 0, implicit-def %5:vreg_128 | 
 |  | 
 |   bb.1: | 
 |     S_NOP 0, implicit %5 | 
 |     S_NOP 0, implicit %4 | 
 |     S_NOP 0, implicit %3 | 
 |     S_NOP 0, implicit %2 | 
 |     S_NOP 0, implicit %1 | 
 |     S_NOP 0, implicit %0 | 
 |     S_NOP 0, implicit-def %10:vreg_128 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0, implicit %0 | 
 |     S_NOP 0, implicit-def %11:vreg_128 | 
 |     S_NOP 0, implicit %10 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0, implicit-def %12:vreg_128 | 
 |     S_NOP 0, implicit %11 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0, implicit-def %13:vreg_128 | 
 |     S_NOP 0, implicit %12 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0 | 
 |     S_NOP 0, implicit %5 | 
 |     S_NOP 0, implicit %4 | 
 |     S_NOP 0, implicit %3 | 
 |     S_NOP 0, implicit %2 | 
 |     S_NOP 0, implicit %1 | 
 |     S_NOP 0, implicit %0 | 
 |     S_NOP 0, implicit %11 | 
 |     S_NOP 0, implicit %12 | 
 |     S_NOP 0, implicit %13 | 
 |  | 
 |   bb.2: | 
 |     S_NOP 0, implicit %0 | 
 |     S_NOP 0, implicit %1 | 
 |     S_NOP 0, implicit %2 | 
 |     S_NOP 0, implicit %3 | 
 |     S_NOP 0, implicit %4 | 
 |     S_NOP 0, implicit %5 | 
 |  | 
 | ... |