[llvm] [AMDGPU] Update LiveInterval def index for early-clobber (PR #79285)
Carl Ritson via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 24 05:13:05 PST 2024
https://github.com/perlfu created https://github.com/llvm/llvm-project/pull/79285
On converting an instruction to an early-clobber definition in convertToThreeAddress, we must also update live intervals for the register to start at the early-clobber index.
>From 9b95cf7645febdb13b54129d5f76b6ab09a7470d Mon Sep 17 00:00:00 2001
From: Carl Ritson <carl.ritson at amd.com>
Date: Tue, 23 Jan 2024 17:01:35 +0900
Subject: [PATCH] [AMDGPU] Update LiveInterval def index for early-clobber
On converting an instruction to an early-clobber definition in
convertToThreeAddress, we must also update live intervals for the
register to start at the early-clobber index.
---
llvm/lib/Target/AMDGPU/SIInstrInfo.cpp | 22 ++++++++++++++++++-
llvm/test/CodeGen/AMDGPU/acc-ldst.ll | 1 +
.../AMDGPU/mfma-no-register-aliasing.ll | 1 +
3 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
index f4ca27808a30411..44d2135a62c3862 100644
--- a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
@@ -3780,8 +3780,28 @@ MachineInstr *SIInstrInfo::convertToThreeAddress(MachineInstr &MI,
for (unsigned I = 0, E = MI.getNumOperands(); I != E; ++I)
MIB.add(MI.getOperand(I));
updateLiveVariables(LV, MI, *MIB);
- if (LIS)
+ if (LIS) {
LIS->ReplaceMachineInstrInMaps(MI, *MIB);
+ // SlotIndex of defs needs to be updated when converting to early-clobber
+ MachineOperand &Def = MIB->getOperand(0);
+ if (Def.isEarlyClobber() && Def.isReg() &&
+ LIS->hasInterval(Def.getReg())) {
+ SlotIndex OldIndex = LIS->getInstructionIndex(*MIB).getRegSlot(false);
+ SlotIndex NewIndex = LIS->getInstructionIndex(*MIB).getRegSlot(true);
+ auto &LI = LIS->getInterval(Def.getReg());
+ auto UpdateDefIndex = [&](LiveRange &LR) {
+ auto S = LR.find(OldIndex);
+ if (S != LR.end() && S->start == OldIndex) {
+ assert(S->valno && S->valno->def == OldIndex);
+ S->start = NewIndex;
+ S->valno->def = NewIndex;
+ }
+ };
+ UpdateDefIndex(LI);
+ for (auto &SR : LI.subranges())
+ UpdateDefIndex(SR);
+ }
+ }
return MIB;
}
diff --git a/llvm/test/CodeGen/AMDGPU/acc-ldst.ll b/llvm/test/CodeGen/AMDGPU/acc-ldst.ll
index cf9c5a2e8f51d0c..be4d6a2c278957a 100644
--- a/llvm/test/CodeGen/AMDGPU/acc-ldst.ll
+++ b/llvm/test/CodeGen/AMDGPU/acc-ldst.ll
@@ -1,4 +1,5 @@
; RUN: llc -mtriple=amdgcn -mcpu=gfx90a -verify-machineinstrs < %s | FileCheck -enable-var-scope --check-prefix=GCN %s
+; RUN: llc -mtriple=amdgcn -mcpu=gfx90a -verify-machineinstrs -early-live-intervals < %s | FileCheck -enable-var-scope --check-prefix=GCN %s
declare <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float, float, <32 x float>, i32, i32, i32)
declare <4 x i32> @llvm.amdgcn.mfma.i32.4x4x4i8(i32, i32, <4 x i32>, i32, i32, i32)
diff --git a/llvm/test/CodeGen/AMDGPU/mfma-no-register-aliasing.ll b/llvm/test/CodeGen/AMDGPU/mfma-no-register-aliasing.ll
index 8ae6e13303446b4..8dbbab3c57f72f1 100644
--- a/llvm/test/CodeGen/AMDGPU/mfma-no-register-aliasing.ll
+++ b/llvm/test/CodeGen/AMDGPU/mfma-no-register-aliasing.ll
@@ -1,5 +1,6 @@
; RUN: llc -mtriple=amdgcn -mcpu=gfx908 -verify-machineinstrs < %s | FileCheck -enable-var-scope --check-prefixes=GCN,GREEDY,GREEDY908 %s
; RUN: llc -mtriple=amdgcn -mcpu=gfx90a -verify-machineinstrs < %s | FileCheck -enable-var-scope --check-prefixes=GCN,GREEDY,GREEDY90A %s
+; RUN: llc -mtriple=amdgcn -mcpu=gfx90a -early-live-intervals -verify-machineinstrs < %s | FileCheck -enable-var-scope --check-prefixes=GCN,GREEDY,GREEDY90A %s
; RUN: llc -mtriple=amdgcn -mcpu=gfx940 -verify-machineinstrs < %s | FileCheck -enable-var-scope --check-prefixes=GCN,GREEDY,GREEDY90A %s
; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx90a -verify-machineinstrs < %s | FileCheck -enable-var-scope --check-prefixes=GCN,GREEDY,GREEDY90A-GISEL %s
; RUN: llc -mtriple=amdgcn -mcpu=gfx90a -sgpr-regalloc=fast -vgpr-regalloc=fast -verify-machineinstrs < %s | FileCheck -enable-var-scope --check-prefixes=GCN,FAST %s
More information about the llvm-commits
mailing list