Skip to content

Commit 6aceae3

Browse files
bcheng0127sys_zuul
authored andcommitted
To avoid compiler crash caused by undefined behavior of WaveShuffleIndex
Change-Id: I9640737749b0a6d98449cf95db291d8a3d795d80
1 parent 23828f5 commit 6aceae3

File tree

1 file changed

+21
-14
lines changed

1 file changed

+21
-14
lines changed

IGC/Compiler/CISACodeGen/PatternMatchPass.cpp

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)