@@ -5940,6 +5940,7 @@ void GraphColor::createLiveRanges() {
5940
5940
}
5941
5941
}
5942
5942
5943
+ template <bool Support4GRFAlign>
5943
5944
void GraphColor::computeDegreeForGRF () {
5944
5945
for (unsigned i = 0 ; i < numVar; i++) {
5945
5946
unsigned degree = 0 ;
@@ -5954,7 +5955,7 @@ void GraphColor::computeDegreeForGRF() {
5954
5955
5955
5956
auto computeDegree = [&](LiveRange *lr1) {
5956
5957
if (!lr1->getIsPartialDcl ()) {
5957
- unsigned edgeDegree = edgeWeightGRF (lrs[i], lr1);
5958
+ unsigned edgeDegree = edgeWeightGRF<Support4GRFAlign> (lrs[i], lr1);
5958
5959
5959
5960
degree += edgeDegree;
5960
5961
@@ -6286,60 +6287,61 @@ void GraphColor::computeSpillCosts(bool useSplitLLRHeuristic, const RPE *rpe) {
6286
6287
// subtract lr's neighbors that are still in work list
6287
6288
//
6288
6289
void GraphColor::relaxNeighborDegreeGRF (LiveRange *lr) {
6289
- if (!(lr->getIsPseudoNode ()) && !(lr->getIsPartialDcl ())) {
6290
- unsigned lr_id = lr->getVar ()->getId ();
6291
- bool lr2EvenAlign = gra.isEvenAligned (lr->getDcl ());
6292
- unsigned int lr2AugAlign = gra.getAugAlign (lr->getDcl ());
6293
- unsigned lr2_nreg = lr->getNumRegNeeded ();
6290
+ if (lr->getIsPseudoNode () || lr->getIsPartialDcl ())
6291
+ return ;
6294
6292
6295
- // relax degree between 2 nodes
6296
- auto relaxDegree = [&](LiveRange *lr1) {
6293
+ unsigned lr_id = lr->getVar ()->getId ();
6294
+ unsigned lr2_nreg = lr->getNumRegNeeded ();
6295
+
6296
+ const std::vector<unsigned > &intfs = intf.getSparseIntfForVar (lr_id);
6297
+ if (gra.use4GRFAlign ) {
6298
+ unsigned int lr2AugAlign = gra.getAugAlign (lr->getDcl ());
6299
+ for (auto it : intfs) {
6300
+ LiveRange *lr1 = lrs[it];
6297
6301
if (lr1->getActive () && !lr1->getIsPseudoNode () &&
6298
6302
!(lr1->getIsPartialDcl ())) {
6299
6303
unsigned lr1_nreg = lr1->getNumRegNeeded ();
6300
- unsigned w = 0 ;
6301
- if (gra.use4GRFAlign ) {
6302
- unsigned int lr1AugAlign = gra.getAugAlign (lr1->getDcl ());
6303
- w = edgeWeightWith4GRF (lr1AugAlign, lr2AugAlign, lr1_nreg, lr2_nreg);
6304
- } else {
6305
- bool lr1EvenAlign = gra.isEvenAligned (lr1->getDcl ());
6306
- w = edgeWeightGRF (lr1EvenAlign, lr2EvenAlign, lr1_nreg, lr2_nreg);
6307
- }
6308
- VISA_DEBUG_VERBOSE ({
6309
- std::cout << " \t relax " ;
6310
- lr1->dump ();
6311
- std::cout << " degree(" << lr1->getDegree () << " ) - " << w << " \n " ;
6312
- });
6313
- lr1->subtractDegree (w);
6314
-
6315
- unsigned availColor = numColor;
6316
- availColor = numColor - lr1->getNumForbidden ();
6317
-
6318
- if (lr1->getDegree () + lr1->getNumRegNeeded () <= availColor) {
6319
- unconstrainedWorklist.push_back (lr1);
6320
- lr1->setActive (false );
6321
- }
6304
+ unsigned int lr1AugAlign = gra.getAugAlign (lr1->getDcl ());
6305
+ auto w =
6306
+ edgeWeightWith4GRF (lr1AugAlign, lr2AugAlign, lr1_nreg, lr2_nreg);
6307
+ relax (lr1, w);
6322
6308
}
6323
- };
6324
-
6325
- const std::vector<unsigned > &intfs = intf.getSparseIntfForVar (lr_id);
6326
- for (auto it : intfs) {
6327
- LiveRange *lrs_it = lrs[it];
6309
+ }
6310
+ return ;
6311
+ }
6328
6312
6329
- relaxDegree (lrs_it);
6313
+ // Handle case where 4GRF align is unsupported
6314
+ bool lr2EvenAlign = gra.isEvenAligned (lr->getDcl ());
6315
+ for (auto it : intfs) {
6316
+ LiveRange *lr1 = lrs[it];
6317
+ if (lr1->getActive () && !lr1->getIsPseudoNode () &&
6318
+ !(lr1->getIsPartialDcl ())) {
6319
+ unsigned lr1_nreg = lr1->getNumRegNeeded ();
6320
+ unsigned w = 0 ;
6321
+ bool lr1EvenAlign = gra.isEvenAligned (lr1->getDcl ());
6322
+ w = edgeWeightGRF (lr1EvenAlign, lr2EvenAlign, lr1_nreg, lr2_nreg);
6323
+ relax (lr1, w);
6330
6324
}
6325
+ }
6331
6326
6332
- auto *weakEdges = intf.getCompatibleSparseIntf (lr->getDcl ());
6333
- if (weakEdges) {
6334
- for (auto weakNeighbor : *weakEdges) {
6335
- if (!weakNeighbor->getRegVar ()->isRegAllocPartaker ())
6336
- continue ;
6337
- auto lr1 = lrs[weakNeighbor->getRegVar ()->getId ()];
6338
- relaxDegree (lr1);
6327
+ // Weak edges are supported only when 4GRF align is unsupported
6328
+ auto *weakEdges = intf.getCompatibleSparseIntf (lr->getDcl ());
6329
+ if (weakEdges) {
6330
+ for (auto weakNeighbor : *weakEdges) {
6331
+ if (!weakNeighbor->getRegVar ()->isRegAllocPartaker ())
6332
+ continue ;
6333
+ auto lr1 = lrs[weakNeighbor->getRegVar ()->getId ()];
6334
+ if (lr1->getActive () && !lr1->getIsPseudoNode () &&
6335
+ !(lr1->getIsPartialDcl ())) {
6336
+ unsigned lr1_nreg = lr1->getNumRegNeeded ();
6337
+ bool lr1EvenAlign = gra.isEvenAligned (lr1->getDcl ());
6338
+ auto w = edgeWeightGRF (lr1EvenAlign, lr2EvenAlign, lr1_nreg, lr2_nreg);
6339
+ relax (lr1, w);
6339
6340
}
6340
6341
}
6341
6342
}
6342
6343
}
6344
+
6343
6345
void GraphColor::relaxNeighborDegreeARF (LiveRange *lr) {
6344
6346
if (!(lr->getIsPseudoNode ())) {
6345
6347
unsigned lr_id = lr->getVar ()->getId ();
@@ -7273,7 +7275,10 @@ bool GraphColor::regAlloc(bool doBankConflictReduction,
7273
7275
// compute degree and spill costs for each live range
7274
7276
//
7275
7277
if (liveAnalysis.livenessClass (G4_GRF)) {
7276
- computeDegreeForGRF ();
7278
+ if (gra.use4GRFAlign )
7279
+ computeDegreeForGRF<true >();
7280
+ else
7281
+ computeDegreeForGRF<false >();
7277
7282
} else {
7278
7283
computeDegreeForARF ();
7279
7284
}
@@ -11812,18 +11817,19 @@ void GlobalRA::insertRestoreAddr(G4_BB *bb) {
11812
11817
// weight computation and later during simplification is necessary for
11813
11818
// correctness.
11814
11819
//
11820
+ template <bool Support4GRFAlign>
11815
11821
unsigned GraphColor::edgeWeightGRF (const LiveRange *lr1, const LiveRange *lr2) {
11816
11822
unsigned lr1_nreg = lr1->getNumRegNeeded ();
11817
11823
unsigned lr2_nreg = lr2->getNumRegNeeded ();
11818
11824
11819
- if (gra. use4GRFAlign ) {
11825
+ if constexpr (Support4GRFAlign ) {
11820
11826
auto lr1Align = gra.getAugAlign (lr1->getDcl ());
11821
11827
auto lr2Align = gra.getAugAlign (lr2->getDcl ());
11822
11828
11823
11829
return edgeWeightWith4GRF (lr1Align, lr2Align, lr1_nreg, lr2_nreg);
11824
11830
} else {
11825
- bool lr1EvenAlign = gra.isEvenAligned (lr1->getDcl ());
11826
- bool lr2EvenAlign = gra.isEvenAligned (lr2->getDcl ());
11831
+ bool lr1EvenAlign = gra.isEvenAligned < false > (lr1->getDcl ());
11832
+ bool lr2EvenAlign = gra.isEvenAligned < false > (lr2->getDcl ());
11827
11833
11828
11834
return edgeWeightGRF (lr1EvenAlign, lr2EvenAlign, lr1_nreg, lr2_nreg);
11829
11835
}
0 commit comments