@@ -5840,19 +5840,19 @@ void HWConformity::fixSendInst(G4_BB* bb)
5840
5840
int dstSize = inst->getMsgDesc ()->ResponseLength ();
5841
5841
int src0Size = src0Overlap ? inst->getMsgDesc ()->MessageLength () : 0 ;
5842
5842
int src1Size = src1Overlap ? inst->getMsgDesc ()->extMessageLength () : 0 ;
5843
- if (dstSize > src0Size + src1Size)
5843
+ if (inst-> getPredicate () || (bb-> isDivergent () && !inst-> isWriteEnableInst ()) || dstSize > src0Size + src1Size)
5844
5844
{
5845
- // copy src0/src1
5845
+ // copy src0/src1 if inst does not update all channels
5846
5846
if (src0Overlap)
5847
5847
{
5848
- G4_Declare* copyDst = builder.createTempVar (src0Size * 8 , Type_UD, Any);
5848
+ G4_Declare* copyDst = builder.createTempVar (src0Size * NUM_DWORDS_PER_GRF , Type_UD, Any);
5849
5849
copyRegs (copyDst, 0 , inst->getSrc (0 )->getBase ()->asRegVar ()->getDeclare (),
5850
5850
inst->getSrc (0 )->asSrcRegRegion ()->getRegOff () * getGRFSize (), src0Size, bb, i);
5851
5851
inst->setSrc (builder.Create_Src_Opnd_From_Dcl (copyDst, builder.getRegionStride1 ()), 0 );
5852
5852
}
5853
5853
if (src1Overlap)
5854
5854
{
5855
- G4_Declare* copyDst = builder.createTempVar (src1Size * 8 , Type_UD, Any);
5855
+ G4_Declare* copyDst = builder.createTempVar (src1Size * NUM_DWORDS_PER_GRF , Type_UD, Any);
5856
5856
copyRegs (copyDst, 0 , inst->getSrc (1 )->getBase ()->asRegVar ()->getDeclare (),
5857
5857
inst->getSrc (1 )->asSrcRegRegion ()->getRegOff () * getGRFSize (), src1Size, bb, i);
5858
5858
inst->setSrc (builder.Create_Src_Opnd_From_Dcl (copyDst, builder.getRegionStride1 ()), 1 );
@@ -5863,7 +5863,7 @@ void HWConformity::fixSendInst(G4_BB* bb)
5863
5863
// copy dst
5864
5864
auto copyIter = i;
5865
5865
++copyIter;
5866
- G4_Declare* copySrc = builder.createTempVar (dstSize * 8 , Type_UD, Any);
5866
+ G4_Declare* copySrc = builder.createTempVar (dstSize * NUM_DWORDS_PER_GRF , Type_UD, Any);
5867
5867
copyRegs (inst->getDst ()->getBase ()->asRegVar ()->getDeclare (), inst->getDst ()->getRegOff () * getGRFSize (),
5868
5868
copySrc, 0 , dstSize, bb, copyIter);
5869
5869
inst->setDest (builder.Create_Dst_Opnd_From_Dcl (copySrc, 1 ));
0 commit comments