[PATCH] D33087: [AMDGCN] Fix overly optimistic GCNUpwardRPTracker
Stanislav Mekhanoshin via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed May 10 20:11:31 PDT 2017
rampitec created this revision.
Herald added subscribers: nhaehnle, arsenm.
1. Remove defs when moving past the defining instruction, not right on it. If an instruction defines and uses a register its pressure is actually 2, not 0.
2. Do not remove tied defs. If def is a tied operand it is not really a new def, just a redefinition.
Repository:
rL LLVM
https://reviews.llvm.org/D33087
Files:
lib/Target/AMDGPU/GCNIterativeScheduler.cpp
lib/Target/AMDGPU/GCNRegPressure.cpp
Index: lib/Target/AMDGPU/GCNRegPressure.cpp
===================================================================
--- lib/Target/AMDGPU/GCNRegPressure.cpp
+++ lib/Target/AMDGPU/GCNRegPressure.cpp
@@ -262,29 +262,31 @@
void GCNUpwardRPTracker::recede(const MachineInstr &MI) {
assert(MRI && "call reset first");
+ // process all defs first to ensure early clobbers are handled correctly
+ // iterating over operands() to catch implicit defs
+ if (LastTrackedMI && !LastTrackedMI->isDebugValue()) {
+ for (const auto &MO : LastTrackedMI->operands()) {
+ if (!MO.isReg() || !MO.isDef() || MO.isTied() ||
+ !TargetRegisterInfo::isVirtualRegister(MO.getReg()))
+ continue;
+
+ auto Reg = MO.getReg();
+ auto &LiveMask = LiveRegs[Reg];
+ auto PrevMask = LiveMask;
+ LiveMask &= ~getDefRegMask(MO);
+ CurPressure.inc(Reg, PrevMask, LiveMask, *MRI);
+ }
+ }
+
LastTrackedMI = &MI;
if (MI.isDebugValue())
return;
- // process all defs first to ensure early clobbers are handled correctly
- // iterating over operands() to catch implicit defs
- for (const auto &MO : MI.operands()) {
- if (!MO.isReg() || !MO.isDef() ||
- !TargetRegisterInfo::isVirtualRegister(MO.getReg()))
- continue;
-
- auto Reg = MO.getReg();
- auto &LiveMask = LiveRegs[Reg];
- auto PrevMask = LiveMask;
- LiveMask &= ~getDefRegMask(MO);
- CurPressure.inc(Reg, PrevMask, LiveMask, *MRI);
- }
-
// then all uses
for (const auto &MO : MI.uses()) {
if (!MO.isReg() || !MO.readsReg() ||
- !TargetRegisterInfo::isVirtualRegister(MO.getReg()))
+ !TargetRegisterInfo::isVirtualRegister(MO.getReg()))
continue;
auto Reg = MO.getReg();
Index: lib/Target/AMDGPU/GCNIterativeScheduler.cpp
===================================================================
--- lib/Target/AMDGPU/GCNIterativeScheduler.cpp
+++ lib/Target/AMDGPU/GCNIterativeScheduler.cpp
@@ -236,6 +236,9 @@
UPTracker.recede(*I);
UPTracker.recede(*Begin);
+ // Second recede to the same instruction to commit all defs.
+ // Current pressure will be updated, but max will stay higher.
+ UPTracker.recede(*Begin);
assert(UPTracker.isValid() ||
(dbgs() << "Tracked region ",
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D33087.98575.patch
Type: text/x-patch
Size: 2261 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170511/36a730a4/attachment.bin>
More information about the llvm-commits
mailing list