@@ -3164,6 +3164,27 @@ void SpillManagerGRF::insertSpillRangeCode(
3164
3164
replacementRangeDcl = spillRangeDcl;
3165
3165
// maintain the spilled dst's subreg since the spill is done on a per-GRF basis
3166
3166
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
+
3167
3188
if (!bb->isAllLaneActive () &&
3168
3189
!preloadNeeded)
3169
3190
{
0 commit comments