diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2013-06-05 03:43:06 +0000 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2013-06-05 03:43:06 +0000 |
commit | ad7ecc65b1b1d6466ff035168c86f208a91aa1b4 (patch) | |
tree | 50680fbe0211eb5a6b6433816f028cc4e09572fc /lib/Target/R600/R600MachineScheduler.cpp | |
parent | 23a22cdedda691b5ed39f75bc1a846fd890f07fb (diff) | |
download | llvm-ad7ecc65b1b1d6466ff035168c86f208a91aa1b4.tar.gz llvm-ad7ecc65b1b1d6466ff035168c86f208a91aa1b4.tar.bz2 llvm-ad7ecc65b1b1d6466ff035168c86f208a91aa1b4.tar.xz |
R600: Make sure to schedule AR register uses and defs in the same clause
Reviewed-by: vljn at ovi.com
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183294 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/R600/R600MachineScheduler.cpp')
-rw-r--r-- | lib/Target/R600/R600MachineScheduler.cpp | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/lib/Target/R600/R600MachineScheduler.cpp b/lib/Target/R600/R600MachineScheduler.cpp index 8d61b8c610..9469e0fc6b 100644 --- a/lib/Target/R600/R600MachineScheduler.cpp +++ b/lib/Target/R600/R600MachineScheduler.cpp @@ -59,8 +59,16 @@ SUnit* R600SchedStrategy::pickNode(bool &IsTopNode) { bool AllowSwitchFromAlu = (CurEmitted >= InstKindLimit[CurInstKind]) && (!Available[IDFetch].empty() || !Available[IDOther].empty()); - if ((AllowSwitchToAlu && CurInstKind != IDAlu) || - (!AllowSwitchFromAlu && CurInstKind == IDAlu)) { + // We want to scheduled AR defs as soon as possible to make sure they aren't + // put in a different ALU clause from their uses. + if (!SU && !UnscheduledARDefs.empty()) { + SU = UnscheduledARDefs[0]; + UnscheduledARDefs.erase(UnscheduledARDefs.begin()); + NextInstKind = IDAlu; + } + + if (!SU && ((AllowSwitchToAlu && CurInstKind != IDAlu) || + (!AllowSwitchFromAlu && CurInstKind == IDAlu))) { // try to pick ALU SU = pickAlu(); if (SU) { @@ -84,6 +92,15 @@ SUnit* R600SchedStrategy::pickNode(bool &IsTopNode) { NextInstKind = IDOther; } + // We want to schedule the AR uses as late as possible to make sure that + // the AR defs have been released. + if (!SU && !UnscheduledARUses.empty()) { + SU = UnscheduledARUses[0]; + UnscheduledARUses.erase(UnscheduledARUses.begin()); + NextInstKind = IDAlu; + } + + DEBUG( if (SU) { dbgs() << " ** Pick node **\n"; @@ -149,6 +166,21 @@ void R600SchedStrategy::releaseBottomNode(SUnit *SU) { DEBUG(dbgs() << "Bottom Releasing ";SU->dump(DAG);); int IK = getInstKind(SU); + + // Check for AR register defines + for (MachineInstr::const_mop_iterator I = SU->getInstr()->operands_begin(), + E = SU->getInstr()->operands_end(); + I != E; ++I) { + if (I->isReg() && I->getReg() == AMDGPU::AR_X) { + if (I->isDef()) { + UnscheduledARDefs.push_back(SU); + } else { + UnscheduledARUses.push_back(SU); + } + return; + } + } + // There is no export clause, we can schedule one as soon as its ready if (IK == IDOther) Available[IDOther].push_back(SU); |