@@ -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);
0 commit comments