Skip to content

Commit

Permalink
[CodeGen] Use delegate to notify targets when virtual registers are c…
Browse files Browse the repository at this point in the history
…reated

This will help targets to customize certain codegen decisions based on
the virtual registers involved in special operations. This patch also
extends the existing delegate in MRI to start support multicast.

Reviewed By: qcolombet

Differential Revision: https://reviews.llvm.org/D134950
  • Loading branch information
cdevadas committed Dec 17, 2022
1 parent 2924782 commit 2f23f5c
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 17 deletions.
2 changes: 1 addition & 1 deletion llvm/include/llvm/CodeGen/LiveRangeEdit.h
Expand Up @@ -133,7 +133,7 @@ class LiveRangeEdit : private MachineRegisterInfo::Delegate {
: Parent(parent), NewRegs(newRegs), MRI(MF.getRegInfo()), LIS(lis),
VRM(vrm), TII(*MF.getSubtarget().getInstrInfo()), TheDelegate(delegate),
FirstNew(newRegs.size()), DeadRemats(deadRemats) {
MRI.setDelegate(this);
MRI.addDelegate(this);
}

~LiveRangeEdit() override { MRI.resetDelegate(this); }
Expand Down
34 changes: 24 additions & 10 deletions llvm/include/llvm/CodeGen/MachineRegisterInfo.h
Expand Up @@ -17,6 +17,7 @@
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/IndexedMap.h"
#include "llvm/ADT/PointerUnion.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/ADT/iterator_range.h"
Expand Down Expand Up @@ -56,11 +57,15 @@ class MachineRegisterInfo {
virtual ~Delegate() = default;

virtual void MRI_NoteNewVirtualRegister(Register Reg) = 0;
virtual void MRI_NotecloneVirtualRegister(Register NewReg,
Register SrcReg) {
MRI_NoteNewVirtualRegister(NewReg);
}
};

private:
MachineFunction *MF;
Delegate *TheDelegate = nullptr;
SmallPtrSet<Delegate *, 1> TheDelegates;

/// True if subregister liveness is tracked.
const bool TracksSubRegLiveness;
Expand Down Expand Up @@ -154,19 +159,28 @@ class MachineRegisterInfo {

void resetDelegate(Delegate *delegate) {
// Ensure another delegate does not take over unless the current
// delegate first unattaches itself. If we ever need to multicast
// notifications, we will need to change to using a list.
assert(TheDelegate == delegate &&
"Only the current delegate can perform reset!");
TheDelegate = nullptr;
// delegate first unattaches itself.
assert(TheDelegates.count(delegate) &&
"Only an existing delegate can perform reset!");
TheDelegates.erase(delegate);
}

void setDelegate(Delegate *delegate) {
assert(delegate && !TheDelegate &&
"Attempted to set delegate to null, or to change it without "
void addDelegate(Delegate *delegate) {
assert(delegate && !TheDelegates.count(delegate) &&
"Attempted to add null delegate, or to change it without "
"first resetting it!");

TheDelegate = delegate;
TheDelegates.insert(delegate);
}

void noteNewVirtualRegister(Register Reg) {
for (auto *TheDelegate : TheDelegates)
TheDelegate->MRI_NoteNewVirtualRegister(Reg);
}

void noteCloneVirtualRegister(Register NewReg, Register SrcReg) {
for (auto *TheDelegate : TheDelegates)
TheDelegate->MRI_NotecloneVirtualRegister(NewReg, SrcReg);
}

//===--------------------------------------------------------------------===//
Expand Down
10 changes: 4 additions & 6 deletions llvm/lib/CodeGen/MachineRegisterInfo.cpp
Expand Up @@ -48,6 +48,7 @@ MachineRegisterInfo::MachineRegisterInfo(MachineFunction *MF)
RegAllocHints.reserve(256);
UsedPhysRegMask.resize(NumRegs);
PhysRegUseDefLists.reset(new MachineOperand*[NumRegs]());
TheDelegates.clear();
}

/// setRegClass - Set the register class of the specified virtual register.
Expand Down Expand Up @@ -162,8 +163,7 @@ MachineRegisterInfo::createVirtualRegister(const TargetRegisterClass *RegClass,
// New virtual register number.
Register Reg = createIncompleteVirtualRegister(Name);
VRegInfo[Reg].first = RegClass;
if (TheDelegate)
TheDelegate->MRI_NoteNewVirtualRegister(Reg);
noteNewVirtualRegister(Reg);
return Reg;
}

Expand All @@ -172,8 +172,7 @@ Register MachineRegisterInfo::cloneVirtualRegister(Register VReg,
Register Reg = createIncompleteVirtualRegister(Name);
VRegInfo[Reg].first = VRegInfo[VReg].first;
setType(Reg, getType(VReg));
if (TheDelegate)
TheDelegate->MRI_NoteNewVirtualRegister(Reg);
noteCloneVirtualRegister(Reg, VReg);
return Reg;
}

Expand All @@ -189,8 +188,7 @@ MachineRegisterInfo::createGenericVirtualRegister(LLT Ty, StringRef Name) {
// FIXME: Should we use a dummy register class?
VRegInfo[Reg].first = static_cast<RegisterBank *>(nullptr);
setType(Reg, Ty);
if (TheDelegate)
TheDelegate->MRI_NoteNewVirtualRegister(Reg);
noteNewVirtualRegister(Reg);
return Reg;
}

Expand Down

0 comments on commit 2f23f5c

Please sign in to comment.