@@ -6940,40 +6940,37 @@ void GraphColor::addCalleeSaveRestoreCode()
6940
6940
//
6941
6941
void GraphColor::addGenxMainStackSetupCode ()
6942
6942
{
6943
+ uint32_t fpInitVal = builder.getOptions ()->getuInt32Option (vISA_SpillMemOffset);
6943
6944
unsigned frameSize = builder.kernel .fg .paramOverflowAreaOffset + builder.kernel .fg .paramOverflowAreaSize ;
6944
6945
G4_Declare* framePtr = builder.kernel .fg .framePtrDcl ;
6945
6946
G4_Declare* stackPtr = builder.kernel .fg .stackPtrDcl ;
6946
6947
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 (); });
6951
6950
//
6952
- // FP = 0
6951
+ // FP = spillMemOffset
6953
6952
//
6954
6953
{
6955
6954
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);
6957
6956
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);
6959
6958
6960
6959
if (builder.kernel .getOption (vISA_GenerateDebugInfo))
6961
6960
{
6962
6961
builder.kernel .getKernelDebugInfo ()->setBEFPSetupInst (fpInst);
6963
6962
builder.kernel .getKernelDebugInfo ()->setFrameSize (frameSize * 16 );
6964
6963
}
6965
-
6966
6964
}
6967
6965
//
6968
- // SP = FrameSize (overflow-area offset + overflow-area size)
6966
+ // SP = FP + FrameSize (overflow-area offset + overflow-area size)
6969
6967
//
6970
6968
{
6971
6969
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);
6973
6971
G4_INST* spIncInst = builder.createMov (1 , dst, src, InstOpt_WriteEnable, false );
6974
- builder. kernel . fg . getEntryBB () ->insert (++insertIt, spIncInst);
6972
+ entryBB ->insert (++insertIt, spIncInst);
6975
6973
}
6976
- builder.instList .clear ();
6977
6974
6978
6975
if (m_options->getOption (vISA_OptReport))
6979
6976
{
@@ -7229,11 +7226,10 @@ void GraphColor::addSaveRestoreCode(unsigned localSpillAreaOwordSize)
7229
7226
gtpin->markInsts ();
7230
7227
}
7231
7228
7232
- if (builder.getIsKernel () == true )
7229
+ if (builder.getIsKernel ())
7233
7230
{
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;
7237
7233
}
7238
7234
else
7239
7235
{
0 commit comments