Skip to content

Commit 0d00bc6

Browse files
[AIEX] Fix LIs in SuperRegRewriter that are related to unallocated registers
Co-Authored-By: Krishnam Tibrewala <[email protected]>
1 parent 6211046 commit 0d00bc6

File tree

3 files changed

+53
-22
lines changed

3 files changed

+53
-22
lines changed

llvm/lib/Target/AIE/AIESuperRegRewriter.cpp

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// See https://llvm.org/LICENSE.txt for license information.
55
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66
//
7-
// (c) Copyright 2023-2024 Advanced Micro Devices, Inc. or its affiliates
7+
// (c) Copyright 2023-2025 Advanced Micro Devices, Inc. or its affiliates
88
//
99
//===----------------------------------------------------------------------===//
1010

@@ -153,6 +153,7 @@ bool AIESuperRegRewriter::runOnMachineFunction(MachineFunction &MF) {
153153

154154
// Collect already-assigned VRegs that can be split into smaller ones.
155155
LLVM_DEBUG(VRM.dump());
156+
LLVM_DEBUG(LIS.dump());
156157
for (unsigned VRegIdx = 0, End = MRI.getNumVirtRegs(); VRegIdx != End;
157158
++VRegIdx) {
158159
Register Reg = Register::index2VirtReg(VRegIdx);
@@ -208,7 +209,8 @@ static LaneBitmask getLiveLanesAt(SlotIndex Index, Register Reg,
208209
/// Rewrite a full copy into multiple copies using the subregs in \p CopySubRegs
209210
static void rewriteFullCopy(MachineInstr &MI, const std::set<int> &CopySubRegs,
210211
LiveIntervals &LIS, const TargetInstrInfo &TII,
211-
const TargetRegisterInfo &TRI) {
212+
const TargetRegisterInfo &TRI, VirtRegMap &VRM,
213+
LiveRegMatrix &LRM) {
212214
assert(MI.isFullCopy());
213215
SlotIndex CopyIndex = LIS.getInstructionIndex(MI);
214216
LLVM_DEBUG(dbgs() << " Changing full copy at " << CopyIndex << ": " << MI);
@@ -217,6 +219,8 @@ static void rewriteFullCopy(MachineInstr &MI, const std::set<int> &CopySubRegs,
217219
LaneBitmask LiveSrcLanes = getLiveLanesAt(CopyIndex, SrcReg, LIS);
218220

219221
LIS.removeVRegDefAt(LIS.getInterval(DstReg), CopyIndex.getRegSlot());
222+
223+
SmallSet<Register, 8> RegistersToRepair;
220224
for (int SubRegIdx : CopySubRegs) {
221225
if ((LiveSrcLanes & TRI.getSubRegIndexLaneMask(SubRegIdx)).none()) {
222226
LLVM_DEBUG(dbgs() << " Skip undef subreg "
@@ -232,10 +236,32 @@ static void rewriteFullCopy(MachineInstr &MI, const std::set<int> &CopySubRegs,
232236
LLVM_DEBUG(dbgs() << " to " << *PartCopy);
233237
LIS.InsertMachineInstrInMaps(*PartCopy);
234238
LIS.getInterval(PartCopy->getOperand(0).getReg());
239+
RegistersToRepair.insert(PartCopy->getOperand(1).getReg());
235240
}
236241

237242
LIS.RemoveMachineInstrFromMaps(MI);
238243
MI.eraseFromParent();
244+
// As we don't handle all registers now (selective LI filter),
245+
// We should make sure that all LiveIntervals are correct.
246+
// If we dont't repair, MI will compose the LIs of some registers,
247+
// what is not correct because MI was deleted.
248+
for (Register R : RegistersToRepair) {
249+
250+
if (!LIS.hasInterval(R))
251+
continue;
252+
253+
if (VRM.hasPhys(R)) {
254+
const MCRegister PhysReg = VRM.getPhys(R);
255+
const LiveInterval &OldLI = LIS.getInterval(R);
256+
LRM.unassign(OldLI);
257+
LIS.removeInterval(R);
258+
const LiveInterval &LI = LIS.createAndComputeVirtRegInterval(R);
259+
LRM.assign(LI, PhysReg);
260+
} else {
261+
LIS.removeInterval(R);
262+
LIS.createAndComputeVirtRegInterval(R);
263+
}
264+
}
239265
}
240266

241267
void AIESuperRegRewriter::rewriteSuperReg(
@@ -260,7 +286,7 @@ void AIESuperRegRewriter::rewriteSuperReg(
260286
for (MachineInstr &MI : make_early_inc_range(MRI.reg_instructions(Reg))) {
261287
if (MI.isFullCopy())
262288
rewriteFullCopy(MI, TRI.getSubRegSplit(MRI.getRegClass(Reg)->getID()),
263-
LIS, *TII, TRI);
289+
LIS, *TII, TRI, VRM, LRM);
264290
}
265291

266292
LLVM_DEBUG(dbgs() << " Splitting range " << LIS.getInterval(Reg) << "\n");

llvm/test/CodeGen/AIE/aie2p/ra/staged-ra-spill.mir

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# See https://llvm.org/LICENSE.txt for license information.
55
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66
#
7-
# (c) Copyright 2023-2024 Advanced Micro Devices, Inc. or its affiliates
7+
# (c) Copyright 2023-2025 Advanced Micro Devices, Inc. or its affiliates
88

99
# RUN: llc -O2 -mtriple=aie2p -verify-machineinstrs --aie-staged-ra -start-before=greedy -stop-after=virtregrewriter %s -o - \
1010
# RUN: | FileCheck %s --check-prefix=RA
@@ -24,23 +24,23 @@ body: |
2424
; RA-NEXT: renamable $dn0 = LDA_dms_lda_idx_imm renamable $p1, 0
2525
; RA-NEXT: renamable $m0 = LDA_dms_lda_idx_imm renamable $p1, 4
2626
; RA-NEXT: renamable $dj0 = LDA_dms_lda_idx_imm renamable $p1, 8
27-
; RA-NEXT: ST_D_SPILL renamable $d0, %stack.0, implicit $sp :: (store (s128) into %stack.0, align 4)
27+
; RA-NEXT: ST_D_SPILL renamable $d0, %stack.1, implicit $sp :: (store (s128) into %stack.1, align 4)
2828
; RA-NEXT: renamable $dj0 = MOV_PD_imm11_pseudo 12
2929
; RA-NEXT: renamable $r0 = LDA_dms_lda_idx renamable $p1, killed renamable $dj0
30-
; RA-NEXT: renamable $d0 = LDA_D_SPILL %stack.0, implicit $sp :: (load (s128) from %stack.0, align 4)
30+
; RA-NEXT: renamable $d0 = LDA_D_SPILL %stack.1, implicit $sp :: (load (s128) from %stack.1, align 4)
3131
; RA-NEXT: renamable $dc0 = COPY killed renamable $r0
32-
; RA-NEXT: ST_D_SPILL killed renamable $d0, %stack.0, implicit $sp :: (store (s128) into %stack.0, align 4)
32+
; RA-NEXT: ST_D_SPILL killed renamable $d0, %stack.1, implicit $sp :: (store (s128) into %stack.1, align 4)
3333
; RA-NEXT: renamable $dn0 = LDA_dms_lda_idx_imm renamable $p1, 16
3434
; RA-NEXT: renamable $m0 = LDA_dms_lda_idx_imm renamable $p1, 20
3535
; RA-NEXT: renamable $dj0 = LDA_dms_lda_idx_imm renamable $p1, 24
3636
; RA-NEXT: renamable $dc0 = LDA_dms_lda_idx_imm killed renamable $p1, 28
37-
; RA-NEXT: ST_D_SPILL killed renamable $d0, %stack.1, implicit $sp :: (store (s128) into %stack.1, align 4)
38-
; RA-NEXT: renamable $d0 = LDA_D_SPILL %stack.0, implicit $sp :: (load (s128) from %stack.0, align 4)
39-
; RA-NEXT: $p0, $dc0 = PADDA_2D_split killed $p0, $m0, $dn0, $dj0, $dc0
4037
; RA-NEXT: ST_D_SPILL killed renamable $d0, %stack.0, implicit $sp :: (store (s128) into %stack.0, align 4)
4138
; RA-NEXT: renamable $d0 = LDA_D_SPILL %stack.1, implicit $sp :: (load (s128) from %stack.1, align 4)
42-
; RA-NEXT: $p0, dead $dc0 = PADDA_2D_split killed $p0, $m0, $dn0, $dj0, $dc0
39+
; RA-NEXT: $p0, $dc0 = PADDA_2D_split killed $p0, killed $m0, killed $dn0, killed $dj0, killed $dc0
40+
; RA-NEXT: ST_D_SPILL renamable $d0, %stack.1, implicit $sp :: (store (s128) into %stack.1, align 4)
4341
; RA-NEXT: renamable $d0 = LDA_D_SPILL %stack.0, implicit $sp :: (load (s128) from %stack.0, align 4)
42+
; RA-NEXT: $p0, dead $dc0 = PADDA_2D_split killed $p0, killed $m0, killed $dn0, killed $dj0, killed $dc0
43+
; RA-NEXT: renamable $d0 = LDA_D_SPILL %stack.1, implicit $sp :: (load (s128) from %stack.1, align 4)
4444
; RA-NEXT: PseudoRET implicit $lr, implicit killed renamable $p0, implicit killed renamable $dc0, implicit $d1, implicit $d2, implicit $d3, implicit $d4, implicit $d5, implicit $d6, implicit $d7
4545
%20:ep = COPY $p0
4646
%21:ep = COPY $p1

llvm/test/CodeGen/AIE/staged-ra-rewrite.mir

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# See https://llvm.org/LICENSE.txt for license information.
55
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66
#
7-
# (c) Copyright 2023-2024 Advanced Micro Devices, Inc. or its affiliates
7+
# (c) Copyright 2023-2025 Advanced Micro Devices, Inc. or its affiliates
88

99
# RUN: llc -O2 -mtriple=aie2 -verify-machineinstrs -run-pass=greedy,aie-superreg-rewrite %s -o - | FileCheck %s --check-prefix=AIE2-VREGS
1010
# RUN: llc -O2 -mtriple=aie2 -verify-machineinstrs --aie-staged-ra -start-before=greedy -stop-after=virtregrewriter %s -o - \
@@ -291,15 +291,16 @@ body: |
291291
; AIE2P-RA-NEXT: renamable $r0 = LDA_dms_lda_idx_imm renamable $p1, 4
292292
; AIE2P-RA-NEXT: renamable $r1 = LDA_dms_lda_idx_imm renamable $p1, 8
293293
; AIE2P-RA-NEXT: renamable $r2 = LDA_dms_lda_idx_imm killed renamable $p1, 12
294-
; AIE2P-RA-NEXT: renamable $dn1 = COPY killed renamable $r0
295-
; AIE2P-RA-NEXT: renamable $dj1 = COPY killed renamable $r1
296-
; AIE2P-RA-NEXT: renamable $dc1 = COPY killed renamable $r2
294+
; AIE2P-RA-NEXT: renamable $dn0 = COPY killed renamable $r0
295+
; AIE2P-RA-NEXT: renamable $m0 = COPY killed renamable $m1
296+
; AIE2P-RA-NEXT: renamable $dj0 = COPY killed renamable $r1
297+
; AIE2P-RA-NEXT: renamable $dc0 = COPY killed renamable $r2
297298
; AIE2P-RA-NEXT: {{ $}}
298299
; AIE2P-RA-NEXT: bb.1:
299-
; AIE2P-RA-NEXT: liveins: $dc1, $dj1, $dn1, $m1, $p0
300+
; AIE2P-RA-NEXT: liveins: $dc0, $dj0, $dn0, $m0, $p0
300301
; AIE2P-RA-NEXT: {{ $}}
301-
; AIE2P-RA-NEXT: $p0, $dc1 = PADDA_2D_split killed $p0, killed $m1, killed $dn1, killed $dj1, killed $dc1
302-
; AIE2P-RA-NEXT: PseudoRET implicit $lr, implicit killed renamable $p0, implicit killed renamable $dc1
302+
; AIE2P-RA-NEXT: $p0, $dc0 = PADDA_2D_split killed $p0, killed $m0, killed $dn0, killed $dj0, killed $dc0
303+
; AIE2P-RA-NEXT: PseudoRET implicit $lr, implicit killed renamable $p0, implicit killed renamable $dc0
303304
bb.1.entry:
304305
liveins: $p0, $p1, $d1
305306
%20:ep = COPY $p0
@@ -444,10 +445,14 @@ body: |
444445
; AIE2P-RA-NEXT: renamable $dc1 = MOV_PD_imm11_pseudo 0
445446
; AIE2P-RA-NEXT: {{ $}}
446447
; AIE2P-RA-NEXT: bb.1:
447-
; AIE2P-RA-NEXT: liveins: $dc1, $dj1, $dn1, $m1, $p0
448+
; AIE2P-RA-NEXT: liveins: $d1:0x0000000000200E00, $p0
448449
; AIE2P-RA-NEXT: {{ $}}
449-
; AIE2P-RA-NEXT: $p0, $dc1 = PADDA_2D_split killed $p0, killed $m1, killed $dn1, killed $dj1, killed $dc1
450-
; AIE2P-RA-NEXT: PseudoRET implicit $lr, implicit killed renamable $p0, implicit killed renamable $dc1
450+
; AIE2P-RA-NEXT: renamable $dc0 = COPY renamable $dc1
451+
; AIE2P-RA-NEXT: renamable $dn0 = COPY renamable $dn1
452+
; AIE2P-RA-NEXT: renamable $dj0 = COPY renamable $dj1
453+
; AIE2P-RA-NEXT: renamable $m0 = COPY killed renamable $m1
454+
; AIE2P-RA-NEXT: $p0, $dc0 = PADDA_2D_split killed $p0, killed $m0, killed $dn0, killed $dj0, killed $dc0
455+
; AIE2P-RA-NEXT: PseudoRET implicit $lr, implicit killed renamable $p0, implicit killed renamable $dc0
451456
bb.1.entry:
452457
liveins: $p0, $m1, $dn1, $dj1
453458
%20:ep = COPY $p0
@@ -623,7 +628,7 @@ body: |
623628
; AIE2P-RA-NEXT: renamable $dc0 = LDA_dms_lda_idx_imm killed renamable $p1, 12
624629
; AIE2P-RA-NEXT: {{ $}}
625630
; AIE2P-RA-NEXT: bb.1:
626-
; AIE2P-RA-NEXT: liveins: $dc0, $dj0, $dn0, $p0
631+
; AIE2P-RA-NEXT: liveins: $d0:0x0000000000000E00, $p0
627632
; AIE2P-RA-NEXT: {{ $}}
628633
; AIE2P-RA-NEXT: $p0, $dc0 = PADDA_2D_split killed $p0, undef $m0, killed $dn0, killed $dj0, killed $dc0
629634
; AIE2P-RA-NEXT: PseudoRET implicit $lr, implicit killed renamable $p0, implicit killed renamable $dc0

0 commit comments

Comments
 (0)