Skip to content

Commit 76efbc0

Browse files
authored
[AMDGPU] Fix codegen to emit COPY instead of S_MOV_B64 for aperture regs (#158754)
1 parent b9f84bc commit 76efbc0

24 files changed

+1123
-1170
lines changed

llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2293,16 +2293,9 @@ Register AMDGPULegalizerInfo::getSegmentAperture(
22932293
assert((ApertureRegNo != AMDGPU::SRC_PRIVATE_BASE ||
22942294
!ST.hasGloballyAddressableScratch()) &&
22952295
"Cannot use src_private_base with globally addressable scratch!");
2296-
// FIXME: It would be more natural to emit a COPY here, but then copy
2297-
// coalescing would kick in and it would think it's okay to use the "HI"
2298-
// subregister (instead of extracting the HI 32 bits) which is an artificial
2299-
// (unusable) register.
2300-
// Register TableGen definitions would need an overhaul to get rid of the
2301-
// artificial "HI" aperture registers and prevent this kind of issue from
2302-
// happening.
23032296
Register Dst = MRI.createGenericVirtualRegister(S64);
23042297
MRI.setRegClass(Dst, &AMDGPU::SReg_64RegClass);
2305-
B.buildInstr(AMDGPU::S_MOV_B64, {Dst}, {Register(ApertureRegNo)});
2298+
B.buildCopy({Dst}, {Register(ApertureRegNo)});
23062299
return B.buildUnmerge(S32, Dst).getReg(1);
23072300
}
23082301

llvm/lib/Target/AMDGPU/SIISelLowering.cpp

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8159,25 +8159,14 @@ SDValue SITargetLowering::getSegmentAperture(unsigned AS, const SDLoc &DL,
81598159
// it returns a wrong value (all zeroes?). The real value is in the upper 32
81608160
// bits.
81618161
//
8162-
// To work around the issue, directly emit a 64 bit mov from this register
8162+
// To work around the issue, emit a 64 bit copy from this register
81638163
// then extract the high bits. Note that this shouldn't even result in a
81648164
// shift being emitted and simply become a pair of registers (e.g.):
81658165
// s_mov_b64 s[6:7], src_shared_base
81668166
// v_mov_b32_e32 v1, s7
8167-
//
8168-
// FIXME: It would be more natural to emit a CopyFromReg here, but then copy
8169-
// coalescing would kick in and it would think it's okay to use the "HI"
8170-
// subregister directly (instead of extracting the HI 32 bits) which is an
8171-
// artificial (unusable) register.
8172-
// Register TableGen definitions would need an overhaul to get rid of the
8173-
// artificial "HI" aperture registers and prevent this kind of issue from
8174-
// happening.
8175-
SDNode *Mov = DAG.getMachineNode(AMDGPU::S_MOV_B64, DL, MVT::i64,
8176-
DAG.getRegister(ApertureRegNo, MVT::i64));
8177-
return DAG.getNode(
8178-
ISD::TRUNCATE, DL, MVT::i32,
8179-
DAG.getNode(ISD::SRL, DL, MVT::i64,
8180-
{SDValue(Mov, 0), DAG.getConstant(32, DL, MVT::i64)}));
8167+
SDValue Copy =
8168+
DAG.getCopyFromReg(DAG.getEntryNode(), DL, ApertureRegNo, MVT::v2i32);
8169+
return DAG.getExtractVectorElt(DL, MVT::i32, Copy, 1);
81818170
}
81828171

81838172
// For code object version 5, private_base and shared_base are passed through

llvm/test/CodeGen/AMDGPU/GlobalISel/flat-scratch-init.gfx.ll

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,11 @@
99
define amdgpu_ps void @amdgpu_ps() {
1010
; MESA-LABEL: amdgpu_ps:
1111
; MESA: ; %bb.0:
12-
; MESA-NEXT: s_add_u32 flat_scratch_lo, s2, s4
13-
; MESA-NEXT: s_addc_u32 flat_scratch_hi, s3, 0
12+
; MESA-NEXT: s_mov_b64 s[0:1], src_private_base
1413
; MESA-NEXT: s_mov_b32 s0, 0
15-
; MESA-NEXT: s_mov_b64 s[2:3], src_private_base
16-
; MESA-NEXT: s_mov_b32 s1, s3
14+
; MESA-NEXT: s_add_u32 flat_scratch_lo, s2, s4
1715
; MESA-NEXT: v_mov_b32_e32 v0, s0
16+
; MESA-NEXT: s_addc_u32 flat_scratch_hi, s3, 0
1817
; MESA-NEXT: v_mov_b32_e32 v2, 0
1918
; MESA-NEXT: v_mov_b32_e32 v1, s1
2019
; MESA-NEXT: flat_store_dword v[0:1], v2
@@ -30,11 +29,10 @@ define amdgpu_ps void @amdgpu_ps() {
3029
; PAL-NEXT: s_waitcnt lgkmcnt(0)
3130
; PAL-NEXT: s_and_b32 s3, s3, 0xffff
3231
; PAL-NEXT: s_add_u32 flat_scratch_lo, s2, s0
33-
; PAL-NEXT: s_addc_u32 flat_scratch_hi, s3, 0
32+
; PAL-NEXT: s_mov_b64 s[0:1], src_private_base
3433
; PAL-NEXT: s_mov_b32 s0, 0
35-
; PAL-NEXT: s_mov_b64 s[2:3], src_private_base
36-
; PAL-NEXT: s_mov_b32 s1, s3
3734
; PAL-NEXT: v_mov_b32_e32 v0, s0
35+
; PAL-NEXT: s_addc_u32 flat_scratch_hi, s3, 0
3836
; PAL-NEXT: v_mov_b32_e32 v1, s1
3937
; PAL-NEXT: flat_store_dword v[0:1], v2
4038
; PAL-NEXT: s_waitcnt vmcnt(0)

llvm/test/CodeGen/AMDGPU/GlobalISel/implicit-kernarg-backend-usage-global-isel.ll

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -65,52 +65,52 @@ define amdgpu_kernel void @addrspacecast(ptr addrspace(5) %ptr.private, ptr addr
6565
;
6666
; GFX9V4-LABEL: addrspacecast:
6767
; GFX9V4: ; %bb.0:
68-
; GFX9V4-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
68+
; GFX9V4-NEXT: s_load_dwordx2 s[4:5], s[8:9], 0x0
6969
; GFX9V4-NEXT: s_add_u32 flat_scratch_lo, s12, s17
7070
; GFX9V4-NEXT: s_addc_u32 flat_scratch_hi, s13, 0
71-
; GFX9V4-NEXT: s_mov_b64 s[2:3], src_private_base
72-
; GFX9V4-NEXT: s_mov_b64 s[4:5], src_shared_base
71+
; GFX9V4-NEXT: s_mov_b64 s[0:1], src_private_base
72+
; GFX9V4-NEXT: s_mov_b64 s[2:3], src_shared_base
7373
; GFX9V4-NEXT: s_waitcnt lgkmcnt(0)
74-
; GFX9V4-NEXT: s_mov_b32 s2, s0
75-
; GFX9V4-NEXT: s_cmp_lg_u32 s0, -1
74+
; GFX9V4-NEXT: s_mov_b32 s0, s4
75+
; GFX9V4-NEXT: s_cmp_lg_u32 s4, -1
76+
; GFX9V4-NEXT: s_cselect_b64 s[0:1], s[0:1], 0
77+
; GFX9V4-NEXT: s_mov_b32 s2, s5
78+
; GFX9V4-NEXT: s_cmp_lg_u32 s5, -1
79+
; GFX9V4-NEXT: v_mov_b32_e32 v0, s0
7680
; GFX9V4-NEXT: s_cselect_b64 s[2:3], s[2:3], 0
77-
; GFX9V4-NEXT: s_mov_b32 s4, s1
78-
; GFX9V4-NEXT: s_cmp_lg_u32 s1, -1
79-
; GFX9V4-NEXT: v_mov_b32_e32 v0, s2
80-
; GFX9V4-NEXT: s_cselect_b64 s[0:1], s[4:5], 0
8181
; GFX9V4-NEXT: v_mov_b32_e32 v2, 1
82-
; GFX9V4-NEXT: v_mov_b32_e32 v1, s3
82+
; GFX9V4-NEXT: v_mov_b32_e32 v1, s1
8383
; GFX9V4-NEXT: flat_store_dword v[0:1], v2
8484
; GFX9V4-NEXT: s_waitcnt vmcnt(0)
85-
; GFX9V4-NEXT: v_mov_b32_e32 v0, s0
85+
; GFX9V4-NEXT: v_mov_b32_e32 v0, s2
8686
; GFX9V4-NEXT: v_mov_b32_e32 v2, 2
87-
; GFX9V4-NEXT: v_mov_b32_e32 v1, s1
87+
; GFX9V4-NEXT: v_mov_b32_e32 v1, s3
8888
; GFX9V4-NEXT: flat_store_dword v[0:1], v2
8989
; GFX9V4-NEXT: s_waitcnt vmcnt(0)
9090
; GFX9V4-NEXT: s_endpgm
9191
;
9292
; GFX9V5-LABEL: addrspacecast:
9393
; GFX9V5: ; %bb.0:
94-
; GFX9V5-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
94+
; GFX9V5-NEXT: s_load_dwordx2 s[4:5], s[8:9], 0x0
9595
; GFX9V5-NEXT: s_add_u32 flat_scratch_lo, s12, s17
9696
; GFX9V5-NEXT: s_addc_u32 flat_scratch_hi, s13, 0
97-
; GFX9V5-NEXT: s_mov_b64 s[2:3], src_private_base
98-
; GFX9V5-NEXT: s_mov_b64 s[4:5], src_shared_base
97+
; GFX9V5-NEXT: s_mov_b64 s[0:1], src_private_base
98+
; GFX9V5-NEXT: s_mov_b64 s[2:3], src_shared_base
9999
; GFX9V5-NEXT: s_waitcnt lgkmcnt(0)
100-
; GFX9V5-NEXT: s_mov_b32 s2, s0
101-
; GFX9V5-NEXT: s_cmp_lg_u32 s0, -1
100+
; GFX9V5-NEXT: s_mov_b32 s0, s4
101+
; GFX9V5-NEXT: s_cmp_lg_u32 s4, -1
102+
; GFX9V5-NEXT: s_cselect_b64 s[0:1], s[0:1], 0
103+
; GFX9V5-NEXT: s_mov_b32 s2, s5
104+
; GFX9V5-NEXT: s_cmp_lg_u32 s5, -1
105+
; GFX9V5-NEXT: v_mov_b32_e32 v0, s0
102106
; GFX9V5-NEXT: s_cselect_b64 s[2:3], s[2:3], 0
103-
; GFX9V5-NEXT: s_mov_b32 s4, s1
104-
; GFX9V5-NEXT: s_cmp_lg_u32 s1, -1
105-
; GFX9V5-NEXT: v_mov_b32_e32 v0, s2
106-
; GFX9V5-NEXT: s_cselect_b64 s[0:1], s[4:5], 0
107107
; GFX9V5-NEXT: v_mov_b32_e32 v2, 1
108-
; GFX9V5-NEXT: v_mov_b32_e32 v1, s3
108+
; GFX9V5-NEXT: v_mov_b32_e32 v1, s1
109109
; GFX9V5-NEXT: flat_store_dword v[0:1], v2
110110
; GFX9V5-NEXT: s_waitcnt vmcnt(0)
111-
; GFX9V5-NEXT: v_mov_b32_e32 v0, s0
111+
; GFX9V5-NEXT: v_mov_b32_e32 v0, s2
112112
; GFX9V5-NEXT: v_mov_b32_e32 v2, 2
113-
; GFX9V5-NEXT: v_mov_b32_e32 v1, s1
113+
; GFX9V5-NEXT: v_mov_b32_e32 v1, s3
114114
; GFX9V5-NEXT: flat_store_dword v[0:1], v2
115115
; GFX9V5-NEXT: s_waitcnt vmcnt(0)
116116
; GFX9V5-NEXT: s_endpgm
@@ -150,10 +150,10 @@ define amdgpu_kernel void @llvm_amdgcn_is_shared(ptr %ptr) #0 {
150150
;
151151
; GFX9V4-LABEL: llvm_amdgcn_is_shared:
152152
; GFX9V4: ; %bb.0:
153-
; GFX9V4-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
154-
; GFX9V4-NEXT: s_mov_b64 s[2:3], src_shared_base
153+
; GFX9V4-NEXT: s_load_dwordx2 s[2:3], s[8:9], 0x0
154+
; GFX9V4-NEXT: s_mov_b64 s[0:1], src_shared_base
155155
; GFX9V4-NEXT: s_waitcnt lgkmcnt(0)
156-
; GFX9V4-NEXT: s_cmp_eq_u32 s1, s3
156+
; GFX9V4-NEXT: s_cmp_eq_u32 s3, s1
157157
; GFX9V4-NEXT: s_cselect_b32 s0, 1, 0
158158
; GFX9V4-NEXT: v_mov_b32_e32 v0, s0
159159
; GFX9V4-NEXT: global_store_dword v[0:1], v0, off
@@ -162,10 +162,10 @@ define amdgpu_kernel void @llvm_amdgcn_is_shared(ptr %ptr) #0 {
162162
;
163163
; GFX9V5-LABEL: llvm_amdgcn_is_shared:
164164
; GFX9V5: ; %bb.0:
165-
; GFX9V5-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
166-
; GFX9V5-NEXT: s_mov_b64 s[2:3], src_shared_base
165+
; GFX9V5-NEXT: s_load_dwordx2 s[2:3], s[8:9], 0x0
166+
; GFX9V5-NEXT: s_mov_b64 s[0:1], src_shared_base
167167
; GFX9V5-NEXT: s_waitcnt lgkmcnt(0)
168-
; GFX9V5-NEXT: s_cmp_eq_u32 s1, s3
168+
; GFX9V5-NEXT: s_cmp_eq_u32 s3, s1
169169
; GFX9V5-NEXT: s_cselect_b32 s0, 1, 0
170170
; GFX9V5-NEXT: v_mov_b32_e32 v0, s0
171171
; GFX9V5-NEXT: global_store_dword v[0:1], v0, off
@@ -206,10 +206,10 @@ define amdgpu_kernel void @llvm_amdgcn_is_private(ptr %ptr) #0 {
206206
;
207207
; GFX9V4-LABEL: llvm_amdgcn_is_private:
208208
; GFX9V4: ; %bb.0:
209-
; GFX9V4-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
210-
; GFX9V4-NEXT: s_mov_b64 s[2:3], src_private_base
209+
; GFX9V4-NEXT: s_load_dwordx2 s[2:3], s[8:9], 0x0
210+
; GFX9V4-NEXT: s_mov_b64 s[0:1], src_private_base
211211
; GFX9V4-NEXT: s_waitcnt lgkmcnt(0)
212-
; GFX9V4-NEXT: s_cmp_eq_u32 s1, s3
212+
; GFX9V4-NEXT: s_cmp_eq_u32 s3, s1
213213
; GFX9V4-NEXT: s_cselect_b32 s0, 1, 0
214214
; GFX9V4-NEXT: v_mov_b32_e32 v0, s0
215215
; GFX9V4-NEXT: global_store_dword v[0:1], v0, off
@@ -218,10 +218,10 @@ define amdgpu_kernel void @llvm_amdgcn_is_private(ptr %ptr) #0 {
218218
;
219219
; GFX9V5-LABEL: llvm_amdgcn_is_private:
220220
; GFX9V5: ; %bb.0:
221-
; GFX9V5-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
222-
; GFX9V5-NEXT: s_mov_b64 s[2:3], src_private_base
221+
; GFX9V5-NEXT: s_load_dwordx2 s[2:3], s[8:9], 0x0
222+
; GFX9V5-NEXT: s_mov_b64 s[0:1], src_private_base
223223
; GFX9V5-NEXT: s_waitcnt lgkmcnt(0)
224-
; GFX9V5-NEXT: s_cmp_eq_u32 s1, s3
224+
; GFX9V5-NEXT: s_cmp_eq_u32 s3, s1
225225
; GFX9V5-NEXT: s_cselect_b32 s0, 1, 0
226226
; GFX9V5-NEXT: v_mov_b32_e32 v0, s0
227227
; GFX9V5-NEXT: global_store_dword v[0:1], v0, off

llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-addrspacecast.mir

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,8 @@ body: |
158158
; GFX9-NEXT: {{ $}}
159159
; GFX9-NEXT: [[COPY:%[0-9]+]]:_(p5) = COPY $vgpr0
160160
; GFX9-NEXT: [[PTRTOINT:%[0-9]+]]:_(s32) = G_PTRTOINT [[COPY]](p5)
161-
; GFX9-NEXT: [[S_MOV_B64_:%[0-9]+]]:sreg_64(s64) = S_MOV_B64 $src_private_base
162-
; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[S_MOV_B64_]](s64)
161+
; GFX9-NEXT: [[COPY1:%[0-9]+]]:sreg_64(s64) = COPY $src_private_base
162+
; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](s64)
163163
; GFX9-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[PTRTOINT]](s32), [[UV1]](s32)
164164
; GFX9-NEXT: [[C:%[0-9]+]]:_(p5) = G_CONSTANT i32 -1
165165
; GFX9-NEXT: [[C1:%[0-9]+]]:_(p0) = G_CONSTANT i64 0
@@ -227,8 +227,8 @@ body: |
227227
; GFX9-NEXT: {{ $}}
228228
; GFX9-NEXT: [[COPY:%[0-9]+]]:_(p3) = COPY $vgpr0
229229
; GFX9-NEXT: [[PTRTOINT:%[0-9]+]]:_(s32) = G_PTRTOINT [[COPY]](p3)
230-
; GFX9-NEXT: [[S_MOV_B64_:%[0-9]+]]:sreg_64(s64) = S_MOV_B64 $src_shared_base
231-
; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[S_MOV_B64_]](s64)
230+
; GFX9-NEXT: [[COPY1:%[0-9]+]]:sreg_64(s64) = COPY $src_shared_base
231+
; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](s64)
232232
; GFX9-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[PTRTOINT]](s32), [[UV1]](s32)
233233
; GFX9-NEXT: [[C:%[0-9]+]]:_(p3) = G_CONSTANT i32 -1
234234
; GFX9-NEXT: [[C1:%[0-9]+]]:_(p0) = G_CONSTANT i64 0
@@ -380,16 +380,16 @@ body: |
380380
; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x p3>) = COPY $vgpr0_vgpr1
381381
; GFX9-NEXT: [[UV:%[0-9]+]]:_(p3), [[UV1:%[0-9]+]]:_(p3) = G_UNMERGE_VALUES [[COPY]](<2 x p3>)
382382
; GFX9-NEXT: [[PTRTOINT:%[0-9]+]]:_(s32) = G_PTRTOINT [[UV]](p3)
383-
; GFX9-NEXT: [[S_MOV_B64_:%[0-9]+]]:sreg_64(s64) = S_MOV_B64 $src_shared_base
384-
; GFX9-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[S_MOV_B64_]](s64)
383+
; GFX9-NEXT: [[COPY1:%[0-9]+]]:sreg_64(s64) = COPY $src_shared_base
384+
; GFX9-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](s64)
385385
; GFX9-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[PTRTOINT]](s32), [[UV3]](s32)
386386
; GFX9-NEXT: [[C:%[0-9]+]]:_(p3) = G_CONSTANT i32 -1
387387
; GFX9-NEXT: [[C1:%[0-9]+]]:_(p0) = G_CONSTANT i64 0
388388
; GFX9-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[UV]](p3), [[C]]
389389
; GFX9-NEXT: [[SELECT:%[0-9]+]]:_(p0) = G_SELECT [[ICMP]](s1), [[MV]], [[C1]]
390390
; GFX9-NEXT: [[PTRTOINT1:%[0-9]+]]:_(s32) = G_PTRTOINT [[UV1]](p3)
391-
; GFX9-NEXT: [[S_MOV_B64_1:%[0-9]+]]:sreg_64(s64) = S_MOV_B64 $src_shared_base
392-
; GFX9-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[S_MOV_B64_1]](s64)
391+
; GFX9-NEXT: [[COPY2:%[0-9]+]]:sreg_64(s64) = COPY $src_shared_base
392+
; GFX9-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY2]](s64)
393393
; GFX9-NEXT: [[MV1:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[PTRTOINT1]](s32), [[UV5]](s32)
394394
; GFX9-NEXT: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[UV1]](p3), [[C]]
395395
; GFX9-NEXT: [[SELECT1:%[0-9]+]]:_(p0) = G_SELECT [[ICMP1]](s1), [[MV1]], [[C1]]
@@ -517,8 +517,8 @@ body: |
517517
; GFX9-LABEL: name: test_addrspacecast_p5_fi_to_p0
518518
; GFX9: [[FRAME_INDEX:%[0-9]+]]:_(p5) = G_FRAME_INDEX %stack.0
519519
; GFX9-NEXT: [[PTRTOINT:%[0-9]+]]:_(s32) = G_PTRTOINT [[FRAME_INDEX]](p5)
520-
; GFX9-NEXT: [[S_MOV_B64_:%[0-9]+]]:sreg_64(s64) = S_MOV_B64 $src_private_base
521-
; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[S_MOV_B64_]](s64)
520+
; GFX9-NEXT: [[COPY:%[0-9]+]]:sreg_64(s64) = COPY $src_private_base
521+
; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](s64)
522522
; GFX9-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[PTRTOINT]](s32), [[UV1]](s32)
523523
; GFX9-NEXT: $vgpr0_vgpr1 = COPY [[MV]](p0)
524524
%0:_(p5) = G_FRAME_INDEX %stack.0

0 commit comments

Comments
 (0)