1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs -stress-regalloc=2 -start-before=greedy -stop-after=virtregmap -o - %s | FileCheck %s 3 4# Test that a spill of a copy of exec is not folded to be a spill of exec directly. 5 6--- 7 8name: merge_sgpr_spill_into_copy_from_exec_lo 9tracksRegLiveness: true 10machineFunctionInfo: 11 isEntryFunction: true 12body: | 13 bb.0: 14 ; CHECK-LABEL: name: merge_sgpr_spill_into_copy_from_exec_lo 15 ; CHECK: liveins: $vgpr0 16 ; CHECK: S_NOP 0, implicit-def $exec_lo 17 ; CHECK: $sgpr0 = S_MOV_B32 $exec_lo 18 ; CHECK: $vgpr0 = V_WRITELANE_B32 killed $sgpr0, 0, $vgpr0 19 ; CHECK: $sgpr0 = V_READLANE_B32 $vgpr0, 0 20 ; CHECK: S_NOP 0, implicit-def dead renamable $sgpr1, implicit-def dead renamable $sgpr0, implicit killed renamable $sgpr0 21 ; CHECK: $sgpr0 = V_READLANE_B32 $vgpr0, 0 22 ; CHECK: $exec_lo = S_MOV_B32 killed $sgpr0 23 ; CHECK: S_SENDMSG 0, implicit $m0, implicit $exec 24 S_NOP 0, implicit-def $exec_lo 25 %0:sreg_32 = COPY $exec_lo 26 S_NOP 0, implicit-def %1:sreg_32, implicit-def %2:sreg_32, implicit %0 27 $exec_lo = COPY %0 28 S_SENDMSG 0, implicit $m0, implicit $exec 29 30... 31--- 32 33name: merge_sgpr_spill_into_copy_from_exec_hi 34tracksRegLiveness: true 35machineFunctionInfo: 36 isEntryFunction: true 37body: | 38 bb.0: 39 ; CHECK-LABEL: name: merge_sgpr_spill_into_copy_from_exec_hi 40 ; CHECK: liveins: $vgpr0 41 ; CHECK: S_NOP 0, implicit-def $exec_hi 42 ; CHECK: $sgpr0 = S_MOV_B32 $exec_hi 43 ; CHECK: $vgpr0 = V_WRITELANE_B32 killed $sgpr0, 0, $vgpr0 44 ; CHECK: $sgpr0 = V_READLANE_B32 $vgpr0, 0 45 ; CHECK: S_NOP 0, implicit-def dead renamable $sgpr1, implicit-def dead renamable $sgpr0, implicit killed renamable $sgpr0 46 ; CHECK: $sgpr0 = V_READLANE_B32 $vgpr0, 0 47 ; CHECK: $exec_hi = S_MOV_B32 killed $sgpr0 48 ; CHECK: S_SENDMSG 0, implicit $m0, implicit $exec 49 S_NOP 0, implicit-def $exec_hi 50 %0:sreg_32 = COPY $exec_hi 51 S_NOP 0, implicit-def %1:sreg_32, implicit-def %2:sreg_32, implicit %0 52 $exec_hi = COPY %0 53 S_SENDMSG 0, implicit $m0, implicit $exec 54 55... 56--- 57 58name: merge_sgpr_spill_into_copy_from_exec 59tracksRegLiveness: true 60machineFunctionInfo: 61 isEntryFunction: true 62body: | 63 bb.0: 64 ; CHECK-LABEL: name: merge_sgpr_spill_into_copy_from_exec 65 ; CHECK: liveins: $vgpr0 66 ; CHECK: S_NOP 0, implicit-def $exec 67 ; CHECK: $sgpr0_sgpr1 = S_MOV_B64 $exec 68 ; CHECK: $vgpr0 = V_WRITELANE_B32 killed $sgpr0, 0, $vgpr0, implicit-def $sgpr0_sgpr1, implicit $sgpr0_sgpr1 69 ; CHECK: $vgpr0 = V_WRITELANE_B32 killed $sgpr1, 1, $vgpr0, implicit $sgpr0_sgpr1 70 ; CHECK: $sgpr0 = V_READLANE_B32 $vgpr0, 0, implicit-def $sgpr0_sgpr1 71 ; CHECK: $sgpr1 = V_READLANE_B32 $vgpr0, 1 72 ; CHECK: S_NOP 0, implicit-def dead renamable $sgpr2_sgpr3, implicit-def dead renamable $sgpr0_sgpr1, implicit killed renamable $sgpr0_sgpr1 73 ; CHECK: $sgpr0 = V_READLANE_B32 $vgpr0, 0, implicit-def $sgpr0_sgpr1 74 ; CHECK: $sgpr1 = V_READLANE_B32 $vgpr0, 1 75 ; CHECK: $exec = S_MOV_B64 killed $sgpr0_sgpr1 76 ; CHECK: S_SENDMSG 0, implicit $m0, implicit $exec 77 S_NOP 0, implicit-def $exec 78 %0:sreg_64 = COPY $exec 79 S_NOP 0, implicit-def %1:sreg_64, implicit-def %2:sreg_64, implicit %0 80 $exec = COPY %0 81 S_SENDMSG 0, implicit $m0, implicit $exec 82 83... 84 85# Test that a reload into a copy of exec is not folded to be a reload of exec directly. 86 87--- 88 89name: reload_sgpr_spill_into_copy_to_exec_lo 90tracksRegLiveness: true 91machineFunctionInfo: 92 isEntryFunction: true 93body: | 94 bb.0: 95 ; CHECK-LABEL: name: reload_sgpr_spill_into_copy_to_exec_lo 96 ; CHECK: liveins: $vgpr0 97 ; CHECK: S_NOP 0, implicit-def renamable $sgpr0, implicit-def dead renamable $sgpr1, implicit-def $exec_lo 98 ; CHECK: $vgpr0 = V_WRITELANE_B32 killed $sgpr0, 0, $vgpr0 99 ; CHECK: $sgpr0 = V_READLANE_B32 $vgpr0, 0 100 ; CHECK: S_NOP 0, implicit killed renamable $sgpr0, implicit-def dead renamable $sgpr1, implicit-def dead renamable $sgpr0 101 ; CHECK: $sgpr0 = V_READLANE_B32 $vgpr0, 0 102 ; CHECK: $exec_lo = S_MOV_B32 killed $sgpr0 103 ; CHECK: S_SENDMSG 0, implicit $m0, implicit $exec 104 S_NOP 0, implicit-def %0:sreg_32, implicit-def %1:sreg_32, implicit-def $exec_lo 105 S_NOP 0, implicit %0, implicit-def %3:sreg_32, implicit-def %4:sreg_32 106 $exec_lo = COPY %0 107 S_SENDMSG 0, implicit $m0, implicit $exec 108 109... 110--- 111 112name: reload_sgpr_spill_into_copy_to_exec_hi 113tracksRegLiveness: true 114machineFunctionInfo: 115 isEntryFunction: true 116body: | 117 bb.0: 118 ; CHECK-LABEL: name: reload_sgpr_spill_into_copy_to_exec_hi 119 ; CHECK: liveins: $vgpr0 120 ; CHECK: S_NOP 0, implicit-def renamable $sgpr0, implicit-def dead renamable $sgpr1, implicit-def $exec_hi 121 ; CHECK: $vgpr0 = V_WRITELANE_B32 killed $sgpr0, 0, $vgpr0 122 ; CHECK: $sgpr0 = V_READLANE_B32 $vgpr0, 0 123 ; CHECK: S_NOP 0, implicit killed renamable $sgpr0, implicit-def dead renamable $sgpr1, implicit-def dead renamable $sgpr0 124 ; CHECK: $sgpr0 = V_READLANE_B32 $vgpr0, 0 125 ; CHECK: $exec_hi = S_MOV_B32 killed $sgpr0 126 ; CHECK: S_SENDMSG 0, implicit $m0, implicit $exec 127 S_NOP 0, implicit-def %0:sreg_32, implicit-def %1:sreg_32, implicit-def $exec_hi 128 S_NOP 0, implicit %0, implicit-def %3:sreg_32, implicit-def %4:sreg_32 129 $exec_hi = COPY %0 130 S_SENDMSG 0, implicit $m0, implicit $exec 131 132... 133--- 134 135name: reload_sgpr_spill_into_copy_to_exec 136tracksRegLiveness: true 137machineFunctionInfo: 138 isEntryFunction: true 139body: | 140 bb.0: 141 ; CHECK-LABEL: name: reload_sgpr_spill_into_copy_to_exec 142 ; CHECK: liveins: $vgpr0 143 ; CHECK: S_NOP 0, implicit-def renamable $sgpr0_sgpr1, implicit-def dead renamable $sgpr2_sgpr3, implicit-def $exec 144 ; CHECK: $vgpr0 = V_WRITELANE_B32 killed $sgpr0, 0, $vgpr0, implicit-def $sgpr0_sgpr1, implicit $sgpr0_sgpr1 145 ; CHECK: $vgpr0 = V_WRITELANE_B32 killed $sgpr1, 1, $vgpr0, implicit $sgpr0_sgpr1 146 ; CHECK: $sgpr0 = V_READLANE_B32 $vgpr0, 0, implicit-def $sgpr0_sgpr1 147 ; CHECK: $sgpr1 = V_READLANE_B32 $vgpr0, 1 148 ; CHECK: S_NOP 0, implicit killed renamable $sgpr0_sgpr1, implicit-def dead renamable $sgpr2_sgpr3, implicit-def dead renamable $sgpr0_sgpr1 149 ; CHECK: $sgpr0 = V_READLANE_B32 $vgpr0, 0, implicit-def $sgpr0_sgpr1 150 ; CHECK: $sgpr1 = V_READLANE_B32 $vgpr0, 1 151 ; CHECK: $exec = S_MOV_B64 killed $sgpr0_sgpr1 152 ; CHECK: S_SENDMSG 0, implicit $m0, implicit $exec 153 S_NOP 0, implicit-def %0:sreg_64, implicit-def %1:sreg_64, implicit-def $exec 154 S_NOP 0, implicit %0, implicit-def %3:sreg_64, implicit-def %4:sreg_64 155 $exec = COPY %0 156 S_SENDMSG 0, implicit $m0, implicit $exec 157 158... 159