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-NEXT: {{ $}} 17 ; CHECK-NEXT: S_NOP 0, implicit-def $exec_lo 18 ; CHECK-NEXT: $sgpr0 = S_MOV_B32 $exec_lo 19 ; CHECK-NEXT: $vgpr0 = V_WRITELANE_B32 killed $sgpr0, 0, $vgpr0 20 ; CHECK-NEXT: $sgpr0 = V_READLANE_B32 $vgpr0, 0 21 ; CHECK-NEXT: S_NOP 0, implicit-def dead renamable $sgpr1, implicit-def dead renamable $sgpr0, implicit killed renamable $sgpr0 22 ; CHECK-NEXT: $sgpr0 = V_READLANE_B32 $vgpr0, 0 23 ; CHECK-NEXT: $exec_lo = S_MOV_B32 killed $sgpr0 24 ; CHECK-NEXT: S_SENDMSG 0, implicit $m0, implicit $exec 25 S_NOP 0, implicit-def $exec_lo 26 %0:sreg_32 = COPY $exec_lo 27 S_NOP 0, implicit-def %1:sreg_32, implicit-def %2:sreg_32, implicit %0 28 $exec_lo = COPY %0 29 S_SENDMSG 0, implicit $m0, implicit $exec 30 31... 32--- 33 34name: merge_sgpr_spill_into_copy_from_exec_hi 35tracksRegLiveness: true 36machineFunctionInfo: 37 isEntryFunction: true 38body: | 39 bb.0: 40 ; CHECK-LABEL: name: merge_sgpr_spill_into_copy_from_exec_hi 41 ; CHECK: liveins: $vgpr0 42 ; CHECK-NEXT: {{ $}} 43 ; CHECK-NEXT: S_NOP 0, implicit-def $exec_hi 44 ; CHECK-NEXT: $sgpr0 = S_MOV_B32 $exec_hi 45 ; CHECK-NEXT: $vgpr0 = V_WRITELANE_B32 killed $sgpr0, 0, $vgpr0 46 ; CHECK-NEXT: $sgpr0 = V_READLANE_B32 $vgpr0, 0 47 ; CHECK-NEXT: S_NOP 0, implicit-def dead renamable $sgpr1, implicit-def dead renamable $sgpr0, implicit killed renamable $sgpr0 48 ; CHECK-NEXT: $sgpr0 = V_READLANE_B32 $vgpr0, 0 49 ; CHECK-NEXT: $exec_hi = S_MOV_B32 killed $sgpr0 50 ; CHECK-NEXT: S_SENDMSG 0, implicit $m0, implicit $exec 51 S_NOP 0, implicit-def $exec_hi 52 %0:sreg_32 = COPY $exec_hi 53 S_NOP 0, implicit-def %1:sreg_32, implicit-def %2:sreg_32, implicit %0 54 $exec_hi = COPY %0 55 S_SENDMSG 0, implicit $m0, implicit $exec 56 57... 58--- 59 60name: merge_sgpr_spill_into_copy_from_exec 61tracksRegLiveness: true 62machineFunctionInfo: 63 isEntryFunction: true 64body: | 65 bb.0: 66 ; CHECK-LABEL: name: merge_sgpr_spill_into_copy_from_exec 67 ; CHECK: liveins: $vgpr0 68 ; CHECK-NEXT: {{ $}} 69 ; CHECK-NEXT: S_NOP 0, implicit-def $exec 70 ; CHECK-NEXT: $sgpr0_sgpr1 = S_MOV_B64 $exec 71 ; CHECK-NEXT: $vgpr0 = V_WRITELANE_B32 killed $sgpr0, 0, $vgpr0, implicit-def $sgpr0_sgpr1, implicit $sgpr0_sgpr1 72 ; CHECK-NEXT: $vgpr0 = V_WRITELANE_B32 killed $sgpr1, 1, $vgpr0, implicit $sgpr0_sgpr1 73 ; CHECK-NEXT: $sgpr0 = V_READLANE_B32 $vgpr0, 0, implicit-def $sgpr0_sgpr1 74 ; CHECK-NEXT: $sgpr1 = V_READLANE_B32 $vgpr0, 1 75 ; CHECK-NEXT: S_NOP 0, implicit-def dead renamable $sgpr2_sgpr3, implicit-def dead renamable $sgpr0_sgpr1, implicit killed renamable $sgpr0_sgpr1 76 ; CHECK-NEXT: $sgpr0 = V_READLANE_B32 $vgpr0, 0, implicit-def $sgpr0_sgpr1 77 ; CHECK-NEXT: $sgpr1 = V_READLANE_B32 $vgpr0, 1 78 ; CHECK-NEXT: $exec = S_MOV_B64 killed $sgpr0_sgpr1 79 ; CHECK-NEXT: S_SENDMSG 0, implicit $m0, implicit $exec 80 S_NOP 0, implicit-def $exec 81 %0:sreg_64 = COPY $exec 82 S_NOP 0, implicit-def %1:sreg_64, implicit-def %2:sreg_64, implicit %0 83 $exec = COPY %0 84 S_SENDMSG 0, implicit $m0, implicit $exec 85 86... 87 88# Test that a reload into a copy of exec is not folded to be a reload of exec directly. 89 90--- 91 92name: reload_sgpr_spill_into_copy_to_exec_lo 93tracksRegLiveness: true 94machineFunctionInfo: 95 isEntryFunction: true 96body: | 97 bb.0: 98 ; CHECK-LABEL: name: reload_sgpr_spill_into_copy_to_exec_lo 99 ; CHECK: liveins: $vgpr0 100 ; CHECK-NEXT: {{ $}} 101 ; CHECK-NEXT: S_NOP 0, implicit-def renamable $sgpr0, implicit-def dead renamable $sgpr1, implicit-def $exec_lo 102 ; CHECK-NEXT: $vgpr0 = V_WRITELANE_B32 killed $sgpr0, 0, $vgpr0 103 ; CHECK-NEXT: $sgpr0 = V_READLANE_B32 $vgpr0, 0 104 ; CHECK-NEXT: S_NOP 0, implicit killed renamable $sgpr0, implicit-def dead renamable $sgpr1, implicit-def dead renamable $sgpr0 105 ; CHECK-NEXT: $sgpr0 = V_READLANE_B32 $vgpr0, 0 106 ; CHECK-NEXT: $exec_lo = S_MOV_B32 killed $sgpr0 107 ; CHECK-NEXT: S_SENDMSG 0, implicit $m0, implicit $exec 108 S_NOP 0, implicit-def %0:sreg_32, implicit-def %1:sreg_32, implicit-def $exec_lo 109 S_NOP 0, implicit %0, implicit-def %3:sreg_32, implicit-def %4:sreg_32 110 $exec_lo = COPY %0 111 S_SENDMSG 0, implicit $m0, implicit $exec 112 113... 114--- 115 116name: reload_sgpr_spill_into_copy_to_exec_hi 117tracksRegLiveness: true 118machineFunctionInfo: 119 isEntryFunction: true 120body: | 121 bb.0: 122 ; CHECK-LABEL: name: reload_sgpr_spill_into_copy_to_exec_hi 123 ; CHECK: liveins: $vgpr0 124 ; CHECK-NEXT: {{ $}} 125 ; CHECK-NEXT: S_NOP 0, implicit-def renamable $sgpr0, implicit-def dead renamable $sgpr1, implicit-def $exec_hi 126 ; CHECK-NEXT: $vgpr0 = V_WRITELANE_B32 killed $sgpr0, 0, $vgpr0 127 ; CHECK-NEXT: $sgpr0 = V_READLANE_B32 $vgpr0, 0 128 ; CHECK-NEXT: S_NOP 0, implicit killed renamable $sgpr0, implicit-def dead renamable $sgpr1, implicit-def dead renamable $sgpr0 129 ; CHECK-NEXT: $sgpr0 = V_READLANE_B32 $vgpr0, 0 130 ; CHECK-NEXT: $exec_hi = S_MOV_B32 killed $sgpr0 131 ; CHECK-NEXT: S_SENDMSG 0, implicit $m0, implicit $exec 132 S_NOP 0, implicit-def %0:sreg_32, implicit-def %1:sreg_32, implicit-def $exec_hi 133 S_NOP 0, implicit %0, implicit-def %3:sreg_32, implicit-def %4:sreg_32 134 $exec_hi = COPY %0 135 S_SENDMSG 0, implicit $m0, implicit $exec 136 137... 138--- 139 140name: reload_sgpr_spill_into_copy_to_exec 141tracksRegLiveness: true 142machineFunctionInfo: 143 isEntryFunction: true 144body: | 145 bb.0: 146 ; CHECK-LABEL: name: reload_sgpr_spill_into_copy_to_exec 147 ; CHECK: liveins: $vgpr0 148 ; CHECK-NEXT: {{ $}} 149 ; CHECK-NEXT: S_NOP 0, implicit-def renamable $sgpr0_sgpr1, implicit-def dead renamable $sgpr2_sgpr3, implicit-def $exec 150 ; CHECK-NEXT: $vgpr0 = V_WRITELANE_B32 killed $sgpr0, 0, $vgpr0, implicit-def $sgpr0_sgpr1, implicit $sgpr0_sgpr1 151 ; CHECK-NEXT: $vgpr0 = V_WRITELANE_B32 killed $sgpr1, 1, $vgpr0, implicit $sgpr0_sgpr1 152 ; CHECK-NEXT: $sgpr0 = V_READLANE_B32 $vgpr0, 0, implicit-def $sgpr0_sgpr1 153 ; CHECK-NEXT: $sgpr1 = V_READLANE_B32 $vgpr0, 1 154 ; CHECK-NEXT: S_NOP 0, implicit killed renamable $sgpr0_sgpr1, implicit-def dead renamable $sgpr2_sgpr3, implicit-def dead renamable $sgpr0_sgpr1 155 ; CHECK-NEXT: $sgpr0 = V_READLANE_B32 $vgpr0, 0, implicit-def $sgpr0_sgpr1 156 ; CHECK-NEXT: $sgpr1 = V_READLANE_B32 $vgpr0, 1 157 ; CHECK-NEXT: $exec = S_MOV_B64 killed $sgpr0_sgpr1 158 ; CHECK-NEXT: S_SENDMSG 0, implicit $m0, implicit $exec 159 S_NOP 0, implicit-def %0:sreg_64, implicit-def %1:sreg_64, implicit-def $exec 160 S_NOP 0, implicit %0, implicit-def %3:sreg_64, implicit-def %4:sreg_64 161 $exec = COPY %0 162 S_SENDMSG 0, implicit $m0, implicit $exec 163 164... 165