Skip to content

Commit 04075d7

Browse files
pratikasharigcbot
authored andcommitted
Calculate correct sub-reg offset for spilled
destination when preload is skipped. Calculate correct sub-reg offset for spilled destination when preload is skipped.
1 parent f3ad21a commit 04075d7

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

visa/SpillManagerGMRF.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3164,6 +3164,27 @@ void SpillManagerGRF::insertSpillRangeCode(
31643164
replacementRangeDcl = spillRangeDcl;
31653165
// maintain the spilled dst's subreg since the spill is done on a per-GRF basis
31663166
newSubregOff = spilledRegion->getSubRegOff();
3167+
3168+
if (preloadNeeded &&
3169+
isUnalignedRegion(spilledRegion, execSize)) {
3170+
// A dst region may be not need pre-fill, however, if it is unaligned,
3171+
// we need to use non-zero sub-reg offset in newly created spill dcl.
3172+
// This section of code computes sub-reg offset to use for such cases.
3173+
// It is insufficient to simply use spilledRegion's sub-reg offset in
3174+
// case the region dcl is an alias of another dcl. This typically happens
3175+
// when 2 scalar dcls are merged by merge scalar pass, merged dcl is
3176+
// spilled, and dominating def writes non-zeroth element.
3177+
unsigned segmentDisp = getEncAlignedSegmentDisp(spilledRegion, execSize);
3178+
unsigned regionDisp = getRegionDisp(spilledRegion);
3179+
assert(regionDisp >= segmentDisp);
3180+
unsigned short subRegOff = (regionDisp - segmentDisp) / spilledRegion->getElemSize();
3181+
assert((regionDisp - segmentDisp) % spilledRegion->getElemSize() == 0);
3182+
assert(subRegOff * spilledRegion->getElemSize() +
3183+
getRegionByteSize(spilledRegion, execSize) <=
3184+
2u * REG_BYTE_SIZE);
3185+
newSubregOff = subRegOff;
3186+
}
3187+
31673188
if (!bb->isAllLaneActive() &&
31683189
!preloadNeeded)
31693190
{

0 commit comments

Comments
 (0)