Skip to content

Commit 8feeb0e

Browse files
wpangfxbot
authored andcommitted
Both schedulers need to track extra dependencies on acc registers.
One extra bucket is necessary. Also fix pre-RA scheduler to allow multiple pseudo-kills on the same variable Change-Id: I6b68b85923ae9df4b8d377ea42f849bfb485a262
1 parent a6aa81e commit 8feeb0e

File tree

3 files changed

+19
-9
lines changed

3 files changed

+19
-9
lines changed

visa/LocalScheduler/G4_Sched.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1432,18 +1432,18 @@ bool LatencyQueue::compare(preNode* N1, preNode* N2)
14321432
}
14331433

14341434
// Find the edge with smallest ID.
1435-
static G4_INST* minElt(const std::vector<preEdge>& Elts)
1435+
static preNode* minElt(const std::vector<preEdge>& Elts)
14361436
{
14371437
assert(!Elts.empty());
14381438
if (Elts.size() == 1)
1439-
return Elts.front().getNode()->getInst();
1439+
return Elts.front().getNode();
14401440
auto Cmp = [](const preEdge& E1, const preEdge& E2) {
14411441
G4_INST* Inst1 = E1.getNode()->getInst();
14421442
G4_INST* Inst2 = E2.getNode()->getInst();
14431443
return Inst1 && Inst2 && Inst1->getLocalId() < Inst2->getLocalId();
14441444
};
14451445
auto E = std::min_element(Elts.begin(), Elts.end(), Cmp);
1446-
return E->getNode()->getInst();
1446+
return E->getNode();
14471447
}
14481448

14491449
// Given an instruction stream [p1 p2 A1 A2 A4 A3]
@@ -1461,8 +1461,10 @@ void BB_Scheduler::relocatePseudoKills()
14611461
for (auto N : ddd.getNodes()) {
14621462
G4_INST* Inst = N->getInst();
14631463
if (Inst && Inst->isPseudoKill()) {
1464-
G4_INST* Pos = minElt(N->Succs);
1465-
LocMap[Pos].push_back(Inst);
1464+
preNode* Pos = minElt(N->Succs);
1465+
while (Pos->getInst()->isPseudoKill())
1466+
Pos = minElt(Pos->Succs);
1467+
LocMap[Pos->getInst()].push_back(Inst);
14661468
}
14671469
}
14681470

@@ -1649,7 +1651,11 @@ void preDDD::buildGraph()
16491651

16501652
static bool isPhyicallyAllocatedRegVar(G4_Operand* opnd)
16511653
{
1652-
if (opnd && opnd->getBase() && opnd->getBase()->isRegVar())
1654+
assert(opnd);
1655+
G4_AccRegSel Acc = opnd->getAccRegSel();
1656+
if (Acc != G4_AccRegSel::ACC_UNDEFINED && Acc != G4_AccRegSel::NOACC)
1657+
return true;
1658+
if (opnd->getBase() && opnd->getBase()->isRegVar())
16531659
return opnd->getBase()->asRegVar()->getPhyReg() != nullptr;
16541660
return false;
16551661
}

visa/LocalScheduler/LocalScheduler_G4IR.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -403,12 +403,17 @@ void DDD::getBucketsForOperand(G4_INST* inst, Gen4_Operand_Number opnd_num,
403403
int baseBucket = GRF_BUCKET;
404404
int endingBucket = baseBucket + opnd->getLinearizedEnd() / divisor;
405405
MUST_BE_TRUE(endingBucket >= startingBucket, "Ending bucket less than starting bucket");
406+
Mask mask = getMaskForOp(opnd, opnd_num, inst->getExecSize());
406407
int numBuckets = endingBucket - startingBucket + 1;
407408
for (int j = startingBucket;
408409
j < (startingBucket + numBuckets); j++) {
409-
Mask mask = getMaskForOp(opnd, opnd_num, inst->getExecSize());
410410
BDvec.push_back(BucketDescr(j, mask, opnd_num));
411411
}
412+
// If this operand is a non-trivial special ACC operand, add
413+
// it to the other ARF bucket for tacking extra dependencies.
414+
G4_AccRegSel Acc = opnd->getAccRegSel();
415+
if (Acc != G4_AccRegSel::ACC_UNDEFINED && Acc != G4_AccRegSel::NOACC)
416+
BDvec.push_back(BucketDescr(OTHER_ARF_BUCKET, mask, opnd_num));
412417
} else {
413418
Mask mask = getMaskForOp(opnd, opnd_num, inst->getExecSize());
414419
BDvec.push_back(BucketDescr(startingBucket, mask, opnd_num));

visa/RegAlloc.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2719,8 +2719,7 @@ void LivenessAnalysis::computeGenKillandPseudoKill(G4_BB* bb,
27192719
{
27202720
iterToInsert--;
27212721
} while ((*iterToInsert)->isPseudoKill());
2722-
G4_DstRegRegion* dstOpnd = fg.builder->createDstRegRegion(Direct, pseudoKill.first->getRegVar(), 0, 0, 1, Type_UD);
2723-
G4_INST* killInst = fg.builder->createInternalInst(NULL, G4_pseudo_kill, NULL, false, 1, dstOpnd, NULL, NULL, 0);
2722+
G4_INST* killInst = fg.builder->createPseudoKill(pseudoKill.first);
27242723
bb->insert(iterToInsert, killInst);
27252724
}
27262725
}

0 commit comments

Comments
 (0)