@@ -4011,6 +4011,7 @@ namespace IGC
40114011
40124012 Value* data = I.getOperand (0 );
40134013 Value* source = I.getOperand (1 );
4014+ uint typeByteSize = data->getType ()->getScalarSizeInBits () / 8 ;
40144015 bool isMatch = false ;
40154016 int subReg = 0 ;
40164017 uint verticalStride = 1 ; // Default value for special case Shuffle( data, (laneID << x) + y ) when x = 0
@@ -4063,21 +4064,27 @@ namespace IGC
40634064 // Finally check for simLaneID intrisic
40644065 if (intrin && (intrin->getIntrinsicID () == GenISAIntrinsic::GenISA_simdLaneId))
40654066 {
4066- MatchRegionPattern* pattern = new (m_allocator) MatchRegionPattern ();
4067- pattern->source .elementOffset = subReg;
4068-
4069- // Set Region Parameters <VerString;Width,HorzString>
4070- pattern->source .region_set = true ;
4071- pattern->source .region [0 ] = verticalStride;
4072- pattern->source .region [1 ] = 1 ;
4073- pattern->source .region [2 ] = 0 ;
4074-
4075- pattern->source .value = data;
4076- MarkAsSource (data);
4077- HandleSubspanUse (data);
4078- AddPattern (pattern);
4067+ // To avoid compiler crash, pattern match with direct mov will be disable
4068+ // Conservetively, we assum simd16 for 32 bytes GRF platforms and simd32 for 64 bytes GRF platforms
4069+ bool cross2GRFs = typeByteSize * (subReg + verticalStride * (m_Platform.getGRFSize () > 32 ? 32 : 16 )) > (2 * m_Platform.getGRFSize ());
4070+ if (!cross2GRFs)
4071+ {
4072+ MatchRegionPattern* pattern = new (m_allocator) MatchRegionPattern ();
4073+ pattern->source .elementOffset = subReg;
4074+
4075+ // Set Region Parameters <VerString;Width,HorzString>
4076+ pattern->source .region_set = true ;
4077+ pattern->source .region [0 ] = verticalStride;
4078+ pattern->source .region [1 ] = 1 ;
4079+ pattern->source .region [2 ] = 0 ;
4080+
4081+ pattern->source .value = data;
4082+ MarkAsSource (data);
4083+ HandleSubspanUse (data);
4084+ AddPattern (pattern);
40794085
4080- isMatch = true ;
4086+ isMatch = true ;
4087+ }
40814088 }
40824089
40834090 return isMatch;
0 commit comments