Skip to content

Commit a71fa25

Browse files
committed
Revert "[llvm][NVPTX] Fix quadratic runtime in ProxyRegErasure (llvm#105730)"
This reverts commit 08e5a1d.
1 parent 84aa02d commit a71fa25

File tree

1 file changed

+32
-28
lines changed

1 file changed

+32
-28
lines changed

llvm/lib/Target/NVPTX/NVPTXProxyRegErasure.cpp

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ void initializeNVPTXProxyRegErasurePass(PassRegistry &);
3434
namespace {
3535

3636
struct NVPTXProxyRegErasure : public MachineFunctionPass {
37+
public:
3738
static char ID;
3839
NVPTXProxyRegErasure() : MachineFunctionPass(ID) {
3940
initializeNVPTXProxyRegErasurePass(*PassRegistry::getPassRegistry());
@@ -48,22 +49,23 @@ struct NVPTXProxyRegErasure : public MachineFunctionPass {
4849
void getAnalysisUsage(AnalysisUsage &AU) const override {
4950
MachineFunctionPass::getAnalysisUsage(AU);
5051
}
52+
53+
private:
54+
void replaceMachineInstructionUsage(MachineFunction &MF, MachineInstr &MI);
55+
56+
void replaceRegisterUsage(MachineInstr &Instr, MachineOperand &From,
57+
MachineOperand &To);
5158
};
5259

5360
} // namespace
5461

5562
char NVPTXProxyRegErasure::ID = 0;
5663

57-
INITIALIZE_PASS(NVPTXProxyRegErasure, "nvptx-proxyreg-erasure",
58-
"NVPTX ProxyReg Erasure", false, false)
64+
INITIALIZE_PASS(NVPTXProxyRegErasure, "nvptx-proxyreg-erasure", "NVPTX ProxyReg Erasure", false, false)
5965

6066
bool NVPTXProxyRegErasure::runOnMachineFunction(MachineFunction &MF) {
6167
SmallVector<MachineInstr *, 16> RemoveList;
6268

63-
// ProxyReg instructions forward a register as another: `%dst = mov.iN %src`.
64-
// Bulk RAUW the `%dst` registers in two passes over the machine function.
65-
DenseMap<Register, Register> RAUWBatch;
66-
6769
for (auto &BB : MF) {
6870
for (auto &MI : BB) {
6971
switch (MI.getOpcode()) {
@@ -72,42 +74,44 @@ bool NVPTXProxyRegErasure::runOnMachineFunction(MachineFunction &MF) {
7274
case NVPTX::ProxyRegI32:
7375
case NVPTX::ProxyRegI64:
7476
case NVPTX::ProxyRegF32:
75-
case NVPTX::ProxyRegF64: {
76-
auto &InOp = *MI.uses().begin();
77-
auto &OutOp = *MI.defs().begin();
78-
assert(InOp.isReg() && "ProxyReg input should be a register.");
79-
assert(OutOp.isReg() && "ProxyReg output should be a register.");
77+
case NVPTX::ProxyRegF64:
78+
replaceMachineInstructionUsage(MF, MI);
8079
RemoveList.push_back(&MI);
81-
RAUWBatch.try_emplace(OutOp.getReg(), InOp.getReg());
8280
break;
8381
}
84-
}
8582
}
8683
}
8784

88-
// If there were no proxy instructions, exit early.
89-
if (RemoveList.empty())
90-
return false;
91-
92-
// Erase the proxy instructions first.
9385
for (auto *MI : RemoveList) {
9486
MI->eraseFromParent();
9587
}
9688

97-
// Now go replace the registers.
89+
return !RemoveList.empty();
90+
}
91+
92+
void NVPTXProxyRegErasure::replaceMachineInstructionUsage(MachineFunction &MF,
93+
MachineInstr &MI) {
94+
auto &InOp = *MI.uses().begin();
95+
auto &OutOp = *MI.defs().begin();
96+
97+
assert(InOp.isReg() && "ProxyReg input operand should be a register.");
98+
assert(OutOp.isReg() && "ProxyReg output operand should be a register.");
99+
98100
for (auto &BB : MF) {
99-
for (auto &MI : BB) {
100-
for (auto &Op : MI.uses()) {
101-
if (!Op.isReg())
102-
continue;
103-
auto it = RAUWBatch.find(Op.getReg());
104-
if (it != RAUWBatch.end())
105-
Op.setReg(it->second);
106-
}
101+
for (auto &I : BB) {
102+
replaceRegisterUsage(I, OutOp, InOp);
107103
}
108104
}
105+
}
109106

110-
return true;
107+
void NVPTXProxyRegErasure::replaceRegisterUsage(MachineInstr &Instr,
108+
MachineOperand &From,
109+
MachineOperand &To) {
110+
for (auto &Op : Instr.uses()) {
111+
if (Op.isReg() && Op.getReg() == From.getReg()) {
112+
Op.setReg(To.getReg());
113+
}
114+
}
111115
}
112116

113117
MachineFunctionPass *llvm::createNVPTXProxyRegErasurePass() {

0 commit comments

Comments
 (0)