@@ -6940,40 +6940,37 @@ void GraphColor::addCalleeSaveRestoreCode()
69406940//
69416941void 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