Skip to content

Commit 26e89c1

Browse files
pratikasharigcbot
authored andcommitted
Make edgeWeightGRF faster
edgeWeightGRF() is a hot method as per VTune profile. For large tests with subroutines, the function consumed about 8% of total compile time. In this change, we breakup edgeWeightGRF() method so that static version in header is devoid of direct memory accesses on objects and can be easily inlined in simplification phase. This brings ~3% reduction in total compile time for large tests.
1 parent b631cdd commit 26e89c1

File tree

2 files changed

+24
-15
lines changed

2 files changed

+24
-15
lines changed

visa/GraphColor.cpp

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5360,12 +5360,17 @@ void GraphColor::computeSpillCosts(bool useSplitLLRHeuristic, const RPE *rpe) {
53605360
void GraphColor::relaxNeighborDegreeGRF(LiveRange *lr) {
53615361
if (!(lr->getIsPseudoNode()) && !(lr->getIsPartialDcl())) {
53625362
unsigned lr_id = lr->getVar()->getId();
5363+
bool lr2EvenAlign = gra.isEvenAligned(lr->getDcl());
5364+
unsigned lr2_nreg = lr->getNumRegNeeded();
53635365

53645366
// relax degree between 2 nodes
53655367
auto relaxDegree = [&](LiveRange *lr1) {
53665368
if (lr1->getActive() && !lr1->getIsPseudoNode() &&
53675369
!(lr1->getIsPartialDcl())) {
5368-
unsigned w = edgeWeightGRF(lr1, lr);
5370+
bool lr1EvenAlign = gra.isEvenAligned(lr1->getDcl());
5371+
unsigned lr1_nreg = lr1->getNumRegNeeded();
5372+
unsigned w =
5373+
edgeWeightGRF(lr1EvenAlign, lr2EvenAlign, lr1_nreg, lr2_nreg);
53695374
VISA_DEBUG_VERBOSE({
53705375
std::cout << "\t relax ";
53715376
lr1->dump();
@@ -10623,23 +10628,11 @@ void GlobalRA::insertRestoreAddr(G4_BB *bb) {
1062310628
//
1062410629
unsigned GraphColor::edgeWeightGRF(const LiveRange *lr1, const LiveRange *lr2) {
1062510630
bool lr1EvenAlign = gra.isEvenAligned(lr1->getDcl());
10631+
bool lr2EvenAlign = gra.isEvenAligned(lr2->getDcl());
1062610632
unsigned lr1_nreg = lr1->getNumRegNeeded();
1062710633
unsigned lr2_nreg = lr2->getNumRegNeeded();
1062810634

10629-
if (!lr1EvenAlign) {
10630-
return lr1_nreg + lr2_nreg - 1;
10631-
}
10632-
10633-
bool lr2EvenAlign = gra.isEvenAligned(lr2->getDcl());
10634-
if (!lr2EvenAlign) {
10635-
unsigned sum = lr1_nreg + lr2_nreg;
10636-
return sum + 1 - ((sum) % 2);
10637-
} else if (lr2EvenAlign) {
10638-
return lr1_nreg + lr2_nreg - 1 + (lr1_nreg % 2) + (lr2_nreg % 2);
10639-
} else {
10640-
vISA_ASSERT_UNREACHABLE("should be unreachable");
10641-
return 0;
10642-
}
10635+
return edgeWeightGRF(lr1EvenAlign, lr2EvenAlign, lr1_nreg, lr2_nreg);
1064310636
}
1064410637

1064510638
unsigned GraphColor::edgeWeightARF(const LiveRange *lr1, const LiveRange *lr2) {

visa/GraphColor.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -887,6 +887,22 @@ class GraphColor {
887887

888888
unsigned edgeWeightGRF(const LiveRange *lr1, const LiveRange *lr2);
889889
unsigned edgeWeightARF(const LiveRange *lr1, const LiveRange *lr2);
890+
static unsigned edgeWeightGRF(bool lr1EvenAlign, bool lr2EvenAlign,
891+
unsigned lr1_nreg, unsigned lr2_nreg) {
892+
if (!lr1EvenAlign) {
893+
return lr1_nreg + lr2_nreg - 1;
894+
}
895+
896+
if (!lr2EvenAlign) {
897+
unsigned sum = lr1_nreg + lr2_nreg;
898+
return sum + 1 - ((sum) % 2);
899+
} else if (lr2EvenAlign) {
900+
return lr1_nreg + lr2_nreg - 1 + (lr1_nreg % 2) + (lr2_nreg % 2);
901+
} else {
902+
vISA_ASSERT_UNREACHABLE("should be unreachable");
903+
return 0;
904+
}
905+
}
890906

891907
void computeDegreeForGRF();
892908
void computeDegreeForARF();

0 commit comments

Comments
 (0)