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