Skip to content

Commit 87fce2b

Browse files
pratikasharsys_zuul
authored andcommitted
Internal change.
Change-Id: I6f7dfd35f424b48d1961b4c364c6c8b7585072c6
1 parent 88b3b8a commit 87fce2b

File tree

6 files changed

+60
-19
lines changed

6 files changed

+60
-19
lines changed

visa/BuildIRImpl.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,7 @@ G4_Declare* IR_Builder::getSpillFillHeader()
727727
{
728728
spillFillHeader = createTempVar(1, Type_UD, GRFALIGN, "spillHeader");
729729
spillFillHeader->setLiveOut();
730+
spillFillHeader->setDoNotSpill();
730731
}
731732
return spillFillHeader;
732733
}

visa/GraphColor.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9256,8 +9256,6 @@ bool GlobalRA::hybridRA(bool doBankConflictReduction, bool highInternalConflict,
92569256
coloring.addSaveRestoreCode(0);
92579257
}
92589258

9259-
expandSpillFillIntrinsics();
9260-
92619259
if (verifyAugmentation)
92629260
{
92639261
assignRegForAliasDcl();
@@ -9326,14 +9324,14 @@ int GlobalRA::coloringRegAlloc()
93269324
flagRegAlloc();
93279325
}
93289326

9327+
93299328
//
93309329
// If the graph has stack calls, then add the caller-save/callee-save pseudo declares and code.
93319330
// This currently must be done after flag/addr RA due to the assumption about the location
93329331
// of the pseudo save/restore instructions
93339332
//
93349333
if (hasStackCall)
93359334
{
9336-
93379335
addCallerSavePseudoCode();
93389336

93399337
// Only GENX sub-graphs require callee-save code.
@@ -9365,7 +9363,9 @@ int GlobalRA::coloringRegAlloc()
93659363
{
93669364
assignRegForAliasDcl();
93679365
computePhyReg();
9368-
expandSpillFillIntrinsics();
9366+
// TODO: Get correct spillSize from LinearScanRA
9367+
unsigned int spillSize = 0;
9368+
expandSpillFillIntrinsics(spillSize);
93699369
if (builder.getOption(vISA_verifyLinearScan))
93709370
{
93719371
resetGlobalRAStates();
@@ -9423,10 +9423,10 @@ int GlobalRA::coloringRegAlloc()
94239423
unsigned iterationNo = 0;
94249424

94259425
int globalScratchOffset = kernel.getInt32KernelAttr(Attributes::ATTR_SpillMemOffset);
9426-
bool useScratchMsgForSpill = globalScratchOffset < (int) (SCRATCH_MSG_LIMIT * 0.6) && !hasStackCall;
9426+
bool useScratchMsgForSpill = !hasStackCall && (globalScratchOffset < (int)(SCRATCH_MSG_LIMIT * 0.6)
9427+
);
94279428
bool enableSpillSpaceCompression = builder.getOption(vISA_SpillSpaceCompression);
94289429

9429-
94309430
uint32_t nextSpillOffset = 0;
94319431
uint32_t scratchOffset = 0;
94329432

@@ -9674,6 +9674,7 @@ int GlobalRA::coloringRegAlloc()
96749674
bool success = spillGRF.insertSpillFillCode(&kernel, pointsToAnalysis);
96759675
nextSpillOffset = spillGRF.getNextOffset();
96769676

9677+
96779678
if (builder.getOption(vISA_RATrace))
96789679
{
96799680
std::cout << "\t--# variables spilled: " << coloring.getSpilledLiveRanges().size() << "\n";
@@ -9737,7 +9738,7 @@ int GlobalRA::coloringRegAlloc()
97379738
regChart->dumpRegChart(std::cerr);
97389739
}
97399740

9740-
expandSpillFillIntrinsics();
9741+
expandSpillFillIntrinsics(nextSpillOffset);
97419742

97429743
if (builder.getOption(vISA_OptReport))
97439744
{

visa/GraphColor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -753,7 +753,7 @@ namespace vISA
753753
void fixAlignment();
754754
void expandSpillIntrinsic(G4_BB*);
755755
void expandFillIntrinsic(G4_BB*);
756-
void expandSpillFillIntrinsics();
756+
void expandSpillFillIntrinsics(unsigned int);
757757

758758
RAVarInfo defaultValues;
759759
std::vector<RAVarInfo> vars;

visa/SpillCleanup.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,8 +300,12 @@ bool CoalesceSpillFills::fillHeuristic(std::list<INST_LIST_ITER>& coalesceableFi
300300
}
301301

302302
min = 0xffffffff, max = 0;
303+
G4_Declare* header = (*coalesceableFills.front())->asFillIntrinsic()->getHeader()->getTopDcl();
303304
for (auto f : coalesceableFills)
304305
{
306+
if ((*f)->asFillIntrinsic()->getHeader()->getTopDcl() != header)
307+
return false;
308+
305309
unsigned int scratchOffset, scratchSize;
306310
getScratchMsgInfo(*f, scratchOffset, scratchSize);
307311

@@ -538,9 +542,17 @@ void CoalesceSpillFills::keepConsecutiveSpills(std::list<INST_LIST_ITER>& instLi
538542
if (sendDstDcl.find(sendDstTopDcl) != sendDstDcl.end())
539543
firstSpillFromSend = true;
540544

545+
G4_Declare* header = (*instList.front())->asSpillIntrinsic()->getHeader()->getTopDcl();
546+
541547
for (auto instIt : instList)
542548
{
543549
auto inst = (*instIt);
550+
551+
if (inst->asSpillIntrinsic()->getHeader()->getTopDcl() != header)
552+
{
553+
return;
554+
}
555+
544556
useNoMask &= inst->isWriteEnableInst();
545557

546558
if (!useNoMask)

visa/SpillManagerGMRF.cpp

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2586,8 +2586,10 @@ SpillManagerGRF::createSpillSendInstr (
25862586
messageDescImm =
25872587
createSpillSendMsgDesc(spillOff, height, execSize, rvar->getBaseRegVar());
25882588
#ifdef _DEBUG
2589-
int offset = (messageDescImm->getInt() & 0xFFF) * numEltPerGRF(Type_UB);
2590-
MUST_BE_TRUE(offset >= globalScratchOffset, "incorrect offset");
2589+
{
2590+
int offset = (messageDescImm->getInt() & 0xFFF) * numEltPerGRF(Type_UB);
2591+
MUST_BE_TRUE(offset >= globalScratchOffset, "incorrect offset");
2592+
}
25912593
#endif
25922594
}
25932595
else
@@ -2606,7 +2608,8 @@ SpillManagerGRF::createSpillSendInstr (
26062608

26072609
auto off = G4_SpillIntrinsic::InvalidOffset;
26082610
G4_Declare* fp = nullptr;
2609-
if (useScratchMsg_)
2611+
if (useScratchMsg_
2612+
)
26102613
off = (messageDescImm->getInt() & 0xfff);
26112614
else
26122615
{
@@ -2621,6 +2624,9 @@ SpillManagerGRF::createSpillSendInstr (
26212624
off = (offset + spillOff * getGRFSize()) >> SCRATCH_SPACE_ADDRESS_UNIT;
26222625
if (builder_->kernel.fg.getIsStackCallFunc() || builder_->kernel.fg.getHasStackCalls())
26232626
fp = builder_->kernel.fg.getFramePtrDcl();
2627+
2628+
if (!fp && offset < SCRATCH_MSG_LIMIT)
2629+
headerOpnd = builder_->Create_Src_Opnd_From_Dcl(builder_->getBuiltinR0(), builder_->getRegionStride1());
26242630
}
26252631
}
26262632
sendInst = builder_->createSpill(postDst, headerOpnd, srcOpnd, execSize, height, off, fp, InstOpt_WriteEnable);
@@ -2650,7 +2656,8 @@ SpillManagerGRF::createSpillSendInstr (
26502656
)
26512657
{
26522658
#ifdef _DEBUG
2653-
if (useScratchMsg_)
2659+
if (useScratchMsg_
2660+
)
26542661
{
26552662
G4_Imm* messageDescImm =
26562663
createSpillSendMsgDesc(spilledRangeRegion, execSize);
@@ -2671,7 +2678,8 @@ SpillManagerGRF::createSpillSendInstr (
26712678

26722679
auto off = G4_SpillIntrinsic::InvalidOffset;
26732680
G4_Declare* fp = nullptr;
2674-
if (useScratchMsg_)
2681+
if (useScratchMsg_
2682+
)
26752683
{
26762684
G4_Imm* messageDescImm =
26772685
createSpillSendMsgDesc(spilledRangeRegion, execSize);
@@ -2691,6 +2699,9 @@ SpillManagerGRF::createSpillSendInstr (
26912699
off = (offset + regOff * getGRFSize()) >> SCRATCH_SPACE_ADDRESS_UNIT;
26922700
if (builder_->kernel.fg.getIsStackCallFunc() || builder_->kernel.fg.getHasStackCalls())
26932701
fp = builder_->kernel.fg.getFramePtrDcl();
2702+
2703+
if (!fp && offset < SCRATCH_MSG_LIMIT)
2704+
headerOpnd = builder_->Create_Src_Opnd_From_Dcl(builder_->getBuiltinR0(), builder_->getRegionStride1());
26942705
}
26952706
}
26962707
sendInst = builder_->createSpill(postDst, headerOpnd, srcOpnd, execSize, (uint16_t)extMsgLength,
@@ -2904,8 +2915,10 @@ SpillManagerGRF::createFillSendInstr (
29042915
messageDescImm =
29052916
createFillSendMsgDesc (spillOff, height, execSize, rvar->getBaseRegVar());
29062917
#ifdef _DEBUG
2907-
int offset = (messageDescImm->getInt() & 0xFFF) * numEltPerGRF(Type_UB);
2908-
MUST_BE_TRUE(offset >= globalScratchOffset, "incorrect offset");
2918+
{
2919+
int offset = (messageDescImm->getInt() & 0xFFF) * numEltPerGRF(Type_UB);
2920+
MUST_BE_TRUE(offset >= globalScratchOffset, "incorrect offset");
2921+
}
29092922
#endif
29102923
}
29112924
else
@@ -2922,7 +2935,8 @@ SpillManagerGRF::createFillSendInstr (
29222935

29232936
unsigned int off = G4_FillIntrinsic::InvalidOffset;
29242937
G4_Declare* fp = nullptr;
2925-
if (useScratchMsg_)
2938+
if (useScratchMsg_
2939+
)
29262940
off = (messageDescImm->getInt() & 0xfff);
29272941
else
29282942
{
@@ -2938,6 +2952,9 @@ SpillManagerGRF::createFillSendInstr (
29382952
off = (offset + spillOff * getGRFSize()) >> SCRATCH_SPACE_ADDRESS_UNIT;
29392953
if (builder_->kernel.fg.getIsStackCallFunc() || builder_->kernel.fg.getHasStackCalls())
29402954
fp = builder_->kernel.fg.getFramePtrDcl();
2955+
2956+
if (!fp && offset < SCRATCH_MSG_LIMIT)
2957+
payload = builder_->Create_Src_Opnd_From_Dcl(builder_->getBuiltinR0(), builder_->getRegionStride1());
29412958
}
29422959
}
29432960
auto fillInst = builder_->createFill(payload, postDst, execSize, height, off, fp, InstOpt_WriteEnable);
@@ -2973,7 +2990,8 @@ SpillManagerGRF::createFillSendInstr(
29732990
unsigned int off = G4_FillIntrinsic::InvalidOffset;
29742991
unsigned segmentByteSize = getSegmentByteSize(filledRangeRegion, oldExecSize);
29752992
G4_Declare* fp = nullptr;
2976-
if (useScratchMsg_)
2993+
if (useScratchMsg_
2994+
)
29772995
{
29782996
G4_Imm* messageDescImm =
29792997
createFillSendMsgDesc(filledRangeRegion, oldExecSize);
@@ -2995,6 +3013,9 @@ SpillManagerGRF::createFillSendInstr(
29953013
off = offset >> SCRATCH_SPACE_ADDRESS_UNIT;
29963014
if (builder_->kernel.fg.getIsStackCallFunc() || builder_->kernel.fg.getHasStackCalls())
29973015
fp = builder_->kernel.fg.getFramePtrDcl();
3016+
3017+
if (!fp && offset < SCRATCH_MSG_LIMIT)
3018+
payload = builder_->Create_Src_Opnd_From_Dcl(builder_->getBuiltinR0(), builder_->getRegionStride1());
29983019
}
29993020
}
30003021

@@ -4234,6 +4255,10 @@ void GlobalRA::expandSpillNonStackcall(
42344255
G4_SrcRegRegion* headerOpnd = builder->Create_Src_Opnd_From_Dcl(builder->getBuiltinR0(), region);
42354256
G4_Imm* extDesc = builder->createImm(msgDesc->getExtendedDesc(), Type_UD);
42364257
G4_ExecSize execSize = inst->getExecSize(); // numRows > 1 ? 16 : 8;
4258+
if (execSize < g4::SIMD8)
4259+
execSize = g4::SIMD8;
4260+
else if (execSize < g4::SIMD16 && numRows > 1)
4261+
execSize = g4::SIMD16;
42374262

42384263
auto sendInst = builder->createInternalSplitSendInst(nullptr, G4_sends, execSize,
42394264
inst->getDst(), headerOpnd, payloadToUse, msgDescImm,
@@ -4561,8 +4586,10 @@ void GlobalRA::expandFillIntrinsic(G4_BB* bb)
45614586
}
45624587

45634588

4564-
void GlobalRA::expandSpillFillIntrinsics()
4589+
void GlobalRA::expandSpillFillIntrinsics(unsigned int spillSizeInBytes)
45654590
{
4591+
auto globalScratchOffset = kernel.getInt32KernelAttr(Attributes::ATTR_SpillMemOffset);
4592+
45664593
for (auto bb : kernel.fg)
45674594
{
45684595
expandSpillIntrinsic(bb);

visa/include/VISAOptions.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ DEF_VISA_OPTION(vISA_LocalBankConflictReduction, ET_BOOL, "-nolocalBCR", UNUSE
105105
DEF_VISA_OPTION(vISA_FailSafeRA, ET_BOOL, "-nofailsafera", UNUSED, true)
106106
DEF_VISA_OPTION(vISA_FlagSpillCodeCleanup, ET_BOOL, "-disableFlagSpillClean", UNUSED, true)
107107
DEF_VISA_OPTION(vISA_GRFSpillCodeCleanup, ET_BOOL, NULLSTR, UNUSED, true)
108-
DEF_VISA_OPTION(vISA_SpillSpaceCompression, ET_BOOL, NULLSTR, UNUSED, true)
108+
DEF_VISA_OPTION(vISA_SpillSpaceCompression, ET_BOOL, "-nospillcompression", UNUSED, true)
109109
DEF_VISA_OPTION(vISA_ConsiderLoopInfoInRA, ET_BOOL, "-noloopra", UNUSED, true)
110110
DEF_VISA_OPTION(vISA_ReserveR0, ET_BOOL, "-reserveR0", UNUSED, false)
111111
DEF_VISA_OPTION(vISA_SpiltLLR, ET_BOOL, "-nosplitllr", UNUSED, true)

0 commit comments

Comments
 (0)