Skip to content

Commit f3ef0ff

Browse files
petechouigcbot
authored andcommitted
SWSB: Optimize getDepForOperand.
Build a static dependency relation table for fast lookup.
1 parent 643fefd commit f3ef0ff

File tree

4 files changed

+31
-112
lines changed

4 files changed

+31
-112
lines changed

visa/LocalScheduler/Dependencies_G4IR.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,3 +247,27 @@ DepType vISA::CheckBarrier(G4_INST *inst)
247247
return NODEP;
248248
}
249249

250+
// Return the dependence type {RAW,WAW,WAR,NODEP} for the given operand numbers
251+
DepType vISA::getDepForOpnd(Gen4_Operand_Number cur, Gen4_Operand_Number liv)
252+
{
253+
assert(Opnd_dst <= cur && cur < Opnd_total_num && "bad operand #");
254+
assert(Opnd_dst <= liv && liv < Opnd_total_num && "bad operand #");
255+
static constexpr DepType matrix[Opnd_total_num][Opnd_total_num] = {
256+
/*dst, src0, src1, src2, src3, src4, src5, src6, src7, pred, condMod, implAccSrc, implAccDst */
257+
/*dst*/ { WAW, RAW, RAW, RAW, RAW, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, RAW, WAW, RAW, WAW },
258+
/*src0*/ { WAR, NODEP, NODEP, NODEP, NODEP, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, NODEP, WAR, NODEP, WAR },
259+
/*src1*/ { WAR, NODEP, NODEP, NODEP, NODEP, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, NODEP, WAR, NODEP, WAR },
260+
/*src2*/ { WAR, NODEP, NODEP, NODEP, NODEP, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, NODEP, WAR, NODEP, WAR },
261+
/*src3*/ { WAR, NODEP, NODEP, NODEP, NODEP, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, NODEP, WAR, NODEP, WAR },
262+
/*src4*/ { DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX },
263+
/*src5*/ { DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX },
264+
/*src6*/ { DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX },
265+
/*src7*/ { DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX },
266+
/*pred*/ { WAR, NODEP, NODEP, NODEP, NODEP, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, NODEP, WAR, NODEP, WAR },
267+
/*condMod*/ { WAW, RAW, RAW, RAW, RAW, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, RAW, WAW, RAW, WAW },
268+
/*implAccSrc*/ { WAR, NODEP, NODEP, NODEP, NODEP, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, NODEP, WAR, NODEP, WAR },
269+
/*implAccDst*/ { WAW, RAW, RAW, RAW, RAW, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, DEPTYPE_MAX, RAW, WAW, RAW, WAW },
270+
};
271+
assert(matrix[cur][liv] != DEPTYPE_MAX && "undefined dependency");
272+
return matrix[cur][liv];
273+
}

visa/LocalScheduler/Dependencies_G4IR.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ SPDX-License-Identifier: MIT
99
#ifndef _DEPENDENCIES_H_
1010
#define _DEPENDENCIES_H_
1111

12+
#include "../G4_Opcode.h"
13+
1214
class Options;
1315

1416
namespace vISA {
@@ -36,6 +38,7 @@ DepType getDepScratchSend(G4_INST *curInst, G4_INST *liveInst);
3638

3739
DepType CheckBarrier(G4_INST *inst);
3840

41+
DepType getDepForOpnd(Gen4_Operand_Number cur, Gen4_Operand_Number liv);
3942
} // namespace vISA
4043

4144
#endif

visa/LocalScheduler/LocalScheduler_G4IR.cpp

Lines changed: 0 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -670,59 +670,6 @@ class LiveBuckets
670670
}
671671
};
672672

673-
// Return the dependence type {RAW,WAW,WAR,NODEP} for given operand numbers
674-
static DepType getDepForOpnd(Gen4_Operand_Number cur,
675-
Gen4_Operand_Number liv) {
676-
switch (cur) {
677-
case Opnd_dst:
678-
case Opnd_implAccDst:
679-
case Opnd_condMod: {
680-
switch (liv) {
681-
case Opnd_dst:
682-
case Opnd_implAccDst:
683-
case Opnd_condMod:
684-
return WAW;
685-
case Opnd_src0:
686-
case Opnd_src1:
687-
case Opnd_src2:
688-
case Opnd_src3:
689-
case Opnd_implAccSrc:
690-
case Opnd_pred:
691-
return RAW;
692-
default:
693-
assert(0 && "bad opnd numb");
694-
return DEPTYPE_MAX; // Unreachable
695-
}
696-
}
697-
case Opnd_src0:
698-
case Opnd_src1:
699-
case Opnd_src2:
700-
case Opnd_src3:
701-
case Opnd_implAccSrc:
702-
case Opnd_pred: {
703-
switch (liv) {
704-
case Opnd_dst:
705-
case Opnd_implAccDst:
706-
case Opnd_condMod:
707-
return WAR;
708-
case Opnd_src0:
709-
case Opnd_src1:
710-
case Opnd_src2:
711-
case Opnd_src3:
712-
case Opnd_implAccSrc:
713-
case Opnd_pred:
714-
return NODEP;
715-
default:
716-
assert(0 && "bad opnd numb");
717-
return DEPTYPE_MAX; // Unreachable
718-
}
719-
}
720-
default:
721-
assert(0 && "bad opnd numb");
722-
return DEPTYPE_MAX; // Unreachable
723-
}
724-
}
725-
726673
/*
727674
Read suppression opportunity checking to group the three source instructions with read suppression into single node
728675
1. per-source slot

visa/LocalScheduler/SWSB_G4IR.cpp

Lines changed: 4 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ SPDX-License-Identifier: MIT
77
============================= end_copyright_notice ===========================*/
88

99
#include "SWSB_G4IR.h"
10+
#include "Dependencies_G4IR.h"
1011
#include "../G4_Opcode.h"
1112
#include "../Timer.h"
1213
#include "../RegAlloc.h"
@@ -205,59 +206,6 @@ static bool WARDepRequired(const G4_INST* inst1, const G4_INST* inst2)
205206
return false;
206207
}
207208

208-
// Return the dependence type {RAW,WAW,WAR,NODEP} for given operand numbers
209-
static DepType getDepForOpnd(Gen4_Operand_Number cur,
210-
Gen4_Operand_Number liv) {
211-
switch (cur) {
212-
case Opnd_dst:
213-
case Opnd_implAccDst:
214-
case Opnd_condMod: {
215-
switch (liv) {
216-
case Opnd_dst:
217-
case Opnd_implAccDst:
218-
case Opnd_condMod:
219-
return WAW;
220-
case Opnd_src0:
221-
case Opnd_src1:
222-
case Opnd_src2:
223-
case Opnd_src3:
224-
case Opnd_implAccSrc:
225-
case Opnd_pred:
226-
return RAW;
227-
default:
228-
assert(0 && "bad opnd numb");
229-
return DEPTYPE_MAX; // Unreachable
230-
}
231-
}
232-
case Opnd_src0:
233-
case Opnd_src1:
234-
case Opnd_src2:
235-
case Opnd_src3:
236-
case Opnd_implAccSrc:
237-
case Opnd_pred: {
238-
switch (liv) {
239-
case Opnd_dst:
240-
case Opnd_implAccDst:
241-
case Opnd_condMod:
242-
return WAR;
243-
case Opnd_src0:
244-
case Opnd_src1:
245-
case Opnd_src2:
246-
case Opnd_src3:
247-
case Opnd_implAccSrc:
248-
case Opnd_pred:
249-
return NODEP;
250-
default:
251-
assert(0 && "bad opnd numb");
252-
return DEPTYPE_MAX; // Unreachable
253-
}
254-
}
255-
default:
256-
assert(0 && "bad opnd numb");
257-
return DEPTYPE_MAX; // Unreachable
258-
}
259-
}
260-
261209
// check if two operands occupy overlapping GRFs
262210
// we put them here instead of inside G4_Operand since this is only valid till after RA
263211
// It's the caller's responsibility to ensure that opnd1 and opnd2 are both GRF allocated
@@ -4729,8 +4677,7 @@ void G4_BB_SB::setSendOpndMayKilled(LiveGRFBuckets* globalSendsLB,
47294677
continue;
47304678
}
47314679

4732-
DepType dep = DEPTYPE_MAX;
4733-
dep = getDepForOpnd(liveOpnd, curOpnd);
4680+
DepType dep = getDepForOpnd(liveOpnd, curOpnd);
47344681

47354682
//For SBID global liveness analysis, both explicit and implicit kill counted.
47364683
if (dep == RAW || dep == WAW)
@@ -5979,8 +5926,7 @@ void G4_BB_SB::SBDDD(G4_BB* bb,
59795926
//RAR: same pipeline R2 kill R1 R2-->live no dependence
59805927
//RAR: different pipelines no kill R1,R2-->live no dependence
59815928
//Find DEP type
5982-
DepType dep = DEPTYPE_MAX;
5983-
dep = getDepForOpnd(liveOpnd, curOpnd);
5929+
DepType dep = getDepForOpnd(liveOpnd, curOpnd);
59845930

59855931
//W/A for the read suppression caused issue
59865932
//1)(~f0.0.anyv) math.cos(2 | M0) r23.7<2>:hf r11.7<4; 2, 2> : hf{ $14 }
@@ -6819,8 +6765,7 @@ void SWSB::addGlobalDependence(unsigned globalSendNum, SBBUCKET_VECTOR* globalSe
68196765
bool hasOverlap = curFootprint->hasOverlap(liveFootprint, internalOffset);
68206766

68216767
//Find DEP type
6822-
DepType dep = DEPTYPE_MAX;
6823-
dep = getDepForOpnd(liveOpnd, curOpnd);
6768+
DepType dep = getDepForOpnd(liveOpnd, curOpnd);
68246769

68256770
//RAW: R kill W R-->live explicit dependence
68266771
//WAW: W2 kill W1 W2-->live explicit dependence

0 commit comments

Comments
 (0)