Skip to content

Commit 8f8b67d

Browse files
weiyu-chensys_zuul
authored andcommitted
Initialize vISA's FP and SP to the spillMemOffset specified in the input option.
Change-Id: Ibe4768ab923df61fabf799b79461fe477bba0834
1 parent 92feb86 commit 8f8b67d

File tree

1 file changed

+12
-16
lines changed

1 file changed

+12
-16
lines changed

visa/GraphColor.cpp

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6940,40 +6940,37 @@ void GraphColor::addCalleeSaveRestoreCode()
69406940
//
69416941
void GraphColor::addGenxMainStackSetupCode()
69426942
{
6943+
uint32_t fpInitVal = builder.getOptions()->getuInt32Option(vISA_SpillMemOffset);
69436944
unsigned frameSize = builder.kernel.fg.paramOverflowAreaOffset + builder.kernel.fg.paramOverflowAreaSize;
69446945
G4_Declare* framePtr = builder.kernel.fg.framePtrDcl;
69456946
G4_Declare* stackPtr = builder.kernel.fg.stackPtrDcl;
69466947

6947-
INST_LIST_ITER insertIt = builder.kernel.fg.getEntryBB()->begin();
6948-
for (; insertIt != builder.kernel.fg.getEntryBB()->end() && (*insertIt)->isLabel();
6949-
++insertIt)
6950-
; // empty body
6948+
auto entryBB = builder.kernel.fg.getEntryBB();
6949+
auto insertIt = std::find_if(entryBB->begin(), entryBB->end(), [](G4_INST* inst) { return !inst->isLabel(); });
69516950
//
6952-
// FP = 0
6951+
// FP = spillMemOffset
69536952
//
69546953
{
69556954
G4_DstRegRegion* dst = builder.createDstRegRegion(Direct, framePtr->getRegVar(), 0, 0, 1, Type_UD);
6956-
G4_Imm * src = builder.createImm(0, Type_UD);
6955+
G4_Imm * src = builder.createImm(fpInitVal, Type_UD);
69576956
G4_INST* fpInst = builder.createMov(1, dst, src, InstOpt_WriteEnable, false);
6958-
insertIt = builder.kernel.fg.getEntryBB()->insert(insertIt, fpInst);
6957+
insertIt = entryBB->insert(insertIt, fpInst);
69596958

69606959
if (builder.kernel.getOption(vISA_GenerateDebugInfo))
69616960
{
69626961
builder.kernel.getKernelDebugInfo()->setBEFPSetupInst(fpInst);
69636962
builder.kernel.getKernelDebugInfo()->setFrameSize(frameSize * 16);
69646963
}
6965-
69666964
}
69676965
//
6968-
// SP = FrameSize (overflow-area offset + overflow-area size)
6966+
// SP = FP + FrameSize (overflow-area offset + overflow-area size)
69696967
//
69706968
{
69716969
G4_DstRegRegion* dst = builder.createDstRegRegion(Direct, stackPtr->getRegVar(), 0, 0, 1, Type_UD);
6972-
G4_Imm * src = builder.createImm(frameSize, Type_UD);
6970+
G4_Imm * src = builder.createImm(fpInitVal + frameSize, Type_UD);
69736971
G4_INST* spIncInst = builder.createMov(1, dst, src, InstOpt_WriteEnable, false);
6974-
builder.kernel.fg.getEntryBB()->insert(++insertIt, spIncInst);
6972+
entryBB->insert(++insertIt, spIncInst);
69756973
}
6976-
builder.instList.clear();
69776974

69786975
if (m_options->getOption(vISA_OptReport))
69796976
{
@@ -7229,11 +7226,10 @@ void GraphColor::addSaveRestoreCode(unsigned localSpillAreaOwordSize)
72297226
gtpin->markInsts();
72307227
}
72317228

7232-
if (builder.getIsKernel() == true)
7229+
if (builder.getIsKernel())
72337230
{
7234-
unsigned int spillMemOffset = builder.getOptions()->getuInt32Option(vISA_SpillMemOffset);
7235-
builder.kernel.fg.callerSaveAreaOffset =
7236-
(spillMemOffset / 16) + localSpillAreaOwordSize;
7231+
// FIXME: why is this only computed for kernel? What about nested calls?
7232+
builder.kernel.fg.callerSaveAreaOffset = localSpillAreaOwordSize;
72377233
}
72387234
else
72397235
{

0 commit comments

Comments
 (0)