Skip to content

Commit 29b7eb8

Browse files
authored
[llvm][stackmaps] Include pristine registers for liveness computation. (llvm#90529)
Users of stackmaps and patchpoints need to add all pristine registers to the spill set, even so they don't need to be all preserved. This fixes the liveness computation for stackmaps to include pristine registers. This fixes rdar://21228337.
1 parent a551272 commit 29b7eb8

File tree

3 files changed

+175
-23
lines changed

3 files changed

+175
-23
lines changed

llvm/lib/CodeGen/StackMapLivenessAnalysis.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,7 @@ bool StackMapLiveness::calculateLiveness(MachineFunction &MF) {
126126
for (auto &MBB : MF) {
127127
LLVM_DEBUG(dbgs() << "****** BB " << MBB.getName() << " ******\n");
128128
LiveRegs.init(*TRI);
129-
// FIXME: This should probably be addLiveOuts().
130-
LiveRegs.addLiveOutsNoPristines(MBB);
129+
LiveRegs.addLiveOuts(MBB);
131130
bool HasStackMap = false;
132131
// Reverse iterate over all instructions and add the current live register
133132
// set to an instruction if we encounter a patchpoint instruction.

llvm/test/CodeGen/AArch64/stackmap-liveness.ll

Lines changed: 76 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,88 @@ define i64 @stackmap_liveness(i1 %c) {
2727
; Padding
2828
; CHECK-NEXT: .p2align 3
2929
; CHECK-NEXT: .short 0
30-
; Num LiveOut Entries: 1
31-
; CHECK-NEXT: .short 2
32-
; LiveOut Entry 0: X0
30+
; Num LiveOut Entries: 20
31+
; CHECK-NEXT: .short 20
32+
; LiveOut Entry 1: X0
3333
; CHECK-NEXT: .short 0
3434
; CHECK-NEXT: .byte 0
3535
; CHECK-NEXT: .byte 8
36-
; LiveOut Entry 1: SP
36+
; LiveOut Entry 2:
37+
; CHECK-NEXT: .short 19
38+
; CHECK-NEXT: .byte 0
39+
; CHECK-NEXT: .byte 8
40+
; LiveOut Entry 3:
41+
; CHECK-NEXT: .short 20
42+
; CHECK-NEXT: .byte 0
43+
; CHECK-NEXT: .byte 8
44+
; LiveOut Entry 4:
45+
; CHECK-NEXT: .short 21
46+
; CHECK-NEXT: .byte 0
47+
; CHECK-NEXT: .byte 8
48+
; LiveOut Entry 5:
49+
; CHECK-NEXT: .short 22
50+
; CHECK-NEXT: .byte 0
51+
; CHECK-NEXT: .byte 8
52+
; LiveOut Entry 6:
53+
; CHECK-NEXT: .short 23
54+
; CHECK-NEXT: .byte 0
55+
; CHECK-NEXT: .byte 8
56+
; LiveOut Entry 7:
57+
; CHECK-NEXT: .short 24
58+
; CHECK-NEXT: .byte 0
59+
; CHECK-NEXT: .byte 8
60+
; LiveOut Entry 8:
61+
; CHECK-NEXT: .short 25
62+
; CHECK-NEXT: .byte 0
63+
; CHECK-NEXT: .byte 8
64+
; LiveOut Entry 9:
65+
; CHECK-NEXT: .short 26
66+
; CHECK-NEXT: .byte 0
67+
; CHECK-NEXT: .byte 8
68+
; LiveOut Entry 10:
69+
; CHECK-NEXT: .short 27
70+
; CHECK-NEXT: .byte 0
71+
; CHECK-NEXT: .byte 8
72+
; LiveOut Entry 11:
73+
; CHECK-NEXT: .short 28
74+
; CHECK-NEXT: .byte 0
75+
; CHECK-NEXT: .byte 8
76+
; LiveOut Entry 12: SP
3777
; CHECK-NEXT: .short 31
3878
; CHECK-NEXT: .byte 0
3979
; CHECK-NEXT: .byte 8
80+
; LiveOut Entry 13:
81+
; CHECK-NEXT: .short 72
82+
; CHECK-NEXT: .byte 0
83+
; CHECK-NEXT: .byte 8
84+
; LiveOut Entry 14:
85+
; CHECK-NEXT: .short 73
86+
; CHECK-NEXT: .byte 0
87+
; CHECK-NEXT: .byte 8
88+
; LiveOut Entry 15:
89+
; CHECK-NEXT: .short 74
90+
; CHECK-NEXT: .byte 0
91+
; CHECK-NEXT: .byte 8
92+
; LiveOut Entry 16:
93+
; CHECK-NEXT: .short 75
94+
; CHECK-NEXT: .byte 0
95+
; CHECK-NEXT: .byte 8
96+
; LiveOut Entry 17:
97+
; CHECK-NEXT: .short 76
98+
; CHECK-NEXT: .byte 0
99+
; CHECK-NEXT: .byte 8
100+
; LiveOut Entry 18:
101+
; CHECK-NEXT: .short 77
102+
; CHECK-NEXT: .byte 0
103+
; CHECK-NEXT: .byte 8
104+
; LiveOut Entry 19:
105+
; CHECK-NEXT: .short 78
106+
; CHECK-NEXT: .byte 0
107+
; CHECK-NEXT: .byte 8
108+
; LiveOut Entry 20:
109+
; CHECK-NEXT: .short 79
110+
; CHECK-NEXT: .byte 0
111+
; CHECK-NEXT: .byte 8
40112
; Align
41113
; CHECK-NEXT: .p2align 3
42114
%1 = select i1 %c, i64 1, i64 2

llvm/test/CodeGen/X86/stackmap-liveness.ll

Lines changed: 98 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,29 @@ entry:
4646
; Padding
4747
; PATCH-NEXT: .p2align 3
4848
; PATCH-NEXT: .short 0
49-
; Num LiveOut Entries: 1
50-
; PATCH-NEXT: .short 1
51-
; LiveOut Entry 1: %ymm2 (16 bytes) --> %xmm2
49+
; Num LiveOut Entries: 6
50+
; PATCH-NEXT: .short 6
51+
; LiveOut Entry 1:
52+
; PATCH-NEXT: .short 3
53+
; PATCH-NEXT: .byte 0
54+
; PATCH-NEXT: .byte 8
55+
; LiveOut Entry 2:
56+
; PATCH-NEXT: .short 12
57+
; PATCH-NEXT: .byte 0
58+
; PATCH-NEXT: .byte 8
59+
; LiveOut Entry 3:
60+
; PATCH-NEXT: .short 13
61+
; PATCH-NEXT: .byte 0
62+
; PATCH-NEXT: .byte 8
63+
; LiveOut Entry 4:
64+
; PATCH-NEXT: .short 14
65+
; PATCH-NEXT: .byte 0
66+
; PATCH-NEXT: .byte 8
67+
; LiveOut Entry 5:
68+
; PATCH-NEXT: .short 15
69+
; PATCH-NEXT: .byte 0
70+
; PATCH-NEXT: .byte 8
71+
; LiveOut Entry 6: %ymm2 (16 bytes) --> %xmm2
5272
; PATCH-NEXT: .short 19
5373
; PATCH-NEXT: .byte 0
5474
; PATCH-NEXT: .byte 16
@@ -79,25 +99,46 @@ entry:
7999
; Padding
80100
; PATCH-NEXT: .p2align 3
81101
; PATCH-NEXT: .short 0
82-
; Num LiveOut Entries: 5
83-
; PATCH-NEXT: .short 5
102+
; Num LiveOut Entries: 10
103+
; PATCH-NEXT: .short 10
104+
84105
; LiveOut Entry 1: %rax (1 bytes) --> %al or %ah
85106
; PATCH-NEXT: .short 0
86107
; PATCH-NEXT: .byte 0
87108
; PATCH-NEXT: .byte 1
88-
; LiveOut Entry 2: %r8 (8 bytes)
109+
; LiveOut Entry 2:
110+
; PATCH-NEXT: .short 3
111+
; PATCH-NEXT: .byte 0
112+
; PATCH-NEXT: .byte 8
113+
; LiveOut Entry 3: %r8 (8 bytes)
89114
; PATCH-NEXT: .short 8
90115
; PATCH-NEXT: .byte 0
91116
; PATCH-NEXT: .byte 8
92-
; LiveOut Entry 3: %ymm0 (32 bytes)
117+
; LiveOut Entry 4:
118+
; PATCH-NEXT: .short 12
119+
; PATCH-NEXT: .byte 0
120+
; PATCH-NEXT: .byte 8
121+
; LiveOut Entry 5:
122+
; PATCH-NEXT: .short 13
123+
; PATCH-NEXT: .byte 0
124+
; PATCH-NEXT: .byte 8
125+
; LiveOut Entry 6:
126+
; PATCH-NEXT: .short 14
127+
; PATCH-NEXT: .byte 0
128+
; PATCH-NEXT: .byte 8
129+
; LiveOut Entry 7:
130+
; PATCH-NEXT: .short 15
131+
; PATCH-NEXT: .byte 0
132+
; PATCH-NEXT: .byte 8
133+
; LiveOut Entry 8: %ymm0 (32 bytes)
93134
; PATCH-NEXT: .short 17
94135
; PATCH-NEXT: .byte 0
95136
; PATCH-NEXT: .byte 32
96-
; LiveOut Entry 4: %ymm1 (32 bytes)
137+
; LiveOut Entry 9: %ymm1 (32 bytes)
97138
; PATCH-NEXT: .short 18
98139
; PATCH-NEXT: .byte 0
99140
; PATCH-NEXT: .byte 32
100-
; LiveOut Entry 5: %ymm2 (16 bytes) --> %xmm2
141+
; LiveOut Entry 10: %ymm2 (16 bytes) --> %xmm2
101142
; PATCH-NEXT: .short 19
102143
; PATCH-NEXT: .byte 0
103144
; PATCH-NEXT: .byte 16
@@ -125,13 +166,33 @@ entry:
125166
; Padding
126167
; PATCH-NEXT: .p2align 3
127168
; PATCH-NEXT: .short 0
128-
; Num LiveOut Entries: 2
129-
; PATCH-NEXT: .short 2
130-
; LiveOut Entry 1: %rsp (8 bytes)
169+
; Num LiveOut Entries: 7
170+
; PATCH-NEXT: .short 7
171+
; LiveOut Entry 1:
172+
; PATCH-NEXT: .short 3
173+
; PATCH-NEXT: .byte 0
174+
; PATCH-NEXT: .byte 8
175+
; LiveOut Entry 2: %rsp (8 bytes)
131176
; PATCH-NEXT: .short 7
132177
; PATCH-NEXT: .byte 0
133178
; PATCH-NEXT: .byte 8
134-
; LiveOut Entry 2: %ymm2 (16 bytes) --> %xmm2
179+
; LiveOut Entry 3:
180+
; PATCH-NEXT: .short 12
181+
; PATCH-NEXT: .byte 0
182+
; PATCH-NEXT: .byte 8
183+
; LiveOut Entry 4:
184+
; PATCH-NEXT: .short 13
185+
; PATCH-NEXT: .byte 0
186+
; PATCH-NEXT: .byte 8
187+
; LiveOut Entry 5:
188+
; PATCH-NEXT: .short 14
189+
; PATCH-NEXT: .byte 0
190+
; PATCH-NEXT: .byte 8
191+
; LiveOut Entry 6:
192+
; PATCH-NEXT: .short 15
193+
; PATCH-NEXT: .byte 0
194+
; PATCH-NEXT: .byte 8
195+
; LiveOut Entry 7: %ymm2 (16 bytes) --> %xmm2
135196
; PATCH-NEXT: .short 19
136197
; PATCH-NEXT: .byte 0
137198
; PATCH-NEXT: .byte 16
@@ -164,13 +225,33 @@ entry:
164225
; Padding
165226
; PATCH-NEXT: .p2align 3
166227
; PATCH-NEXT: .short 0
167-
; Num LiveOut Entries: 2
168-
; PATCH-NEXT: .short 2
169-
; LiveOut Entry 1: %rsp (8 bytes)
228+
; Num LiveOut Entries: 7
229+
; PATCH-NEXT: .short 7
230+
; LiveOut Entry 1:
231+
; PATCH-NEXT: .short 3
232+
; PATCH-NEXT: .byte 0
233+
; PATCH-NEXT: .byte 8
234+
; LiveOut Entry 2: %rsp (8 bytes)
170235
; PATCH-NEXT: .short 7
171236
; PATCH-NEXT: .byte 0
172237
; PATCH-NEXT: .byte 8
173-
; LiveOut Entry 2: %ymm2 (16 bytes) --> %xmm2
238+
; LiveOut Entry 3:
239+
; PATCH-NEXT: .short 12
240+
; PATCH-NEXT: .byte 0
241+
; PATCH-NEXT: .byte 8
242+
; LiveOut Entry 4:
243+
; PATCH-NEXT: .short 13
244+
; PATCH-NEXT: .byte 0
245+
; PATCH-NEXT: .byte 8
246+
; LiveOut Entry 5:
247+
; PATCH-NEXT: .short 14
248+
; PATCH-NEXT: .byte 0
249+
; PATCH-NEXT: .byte 8
250+
; LiveOut Entry 6:
251+
; PATCH-NEXT: .short 15
252+
; PATCH-NEXT: .byte 0
253+
; PATCH-NEXT: .byte 8
254+
; LiveOut Entry 7: %ymm2 (16 bytes) --> %xmm2
174255
; PATCH-NEXT: .short 19
175256
; PATCH-NEXT: .byte 0
176257
; PATCH-NEXT: .byte 16

0 commit comments

Comments
 (0)