Skip to content

Commit 225bd22

Browse files
weiyu-chengfxbot
authored andcommitted
Fix incorrect code gen in global var split when replacing
operand with non-dw type Change-Id: I5280e3cd794f31e448151a0bae4438c83af43afd
1 parent 9df1932 commit 225bd22

File tree

2 files changed

+14
-37
lines changed

2 files changed

+14
-37
lines changed

visa/GraphColor.cpp

Lines changed: 13 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8696,7 +8696,7 @@ void VarSplit::insertMovesToTemp(IR_Builder& builder, G4_Declare* oldDcl, G4_Ope
86968696
return;
86978697
}
86988698

8699-
void VarSplit::insertMovesFromTemp(G4_Kernel& kernel, G4_Declare* oldDcl, int index, G4_Operand *srcOpnd, int pos, G4_BB* bb, INST_LIST_ITER instIter, std::vector<G4_Declare*> &splitDclList)
8699+
void VarSplit::insertMovesFromTemp(G4_Kernel& kernel, G4_Declare* oldDcl, int index, G4_SrcRegRegion *srcOpnd, int pos, G4_BB* bb, INST_LIST_ITER instIter, std::vector<G4_Declare*> &splitDclList)
87008700
{
87018701
G4_INST *inst = (*instIter);
87028702

@@ -8705,16 +8705,9 @@ void VarSplit::insertMovesFromTemp(G4_Kernel& kernel, G4_Declare* oldDcl, int in
87058705
int splitSize = kernel.getSimdSize() == 8 ? 1 : 2;
87068706
if (sizeInGRF != splitSize)
87078707
{
8708-
unsigned short dclWidth = 0;
8709-
unsigned short dclHeight = 0;
8710-
int dclTotalSize = 0;
8711-
G4_SrcRegRegion* oldSrc = srcOpnd->asSrcRegRegion();
8712-
getHeightWidth(oldSrc->getType(), (srcOpnd->getRightBound() - srcOpnd->getLeftBound() + 1) / oldSrc->getElemSize(), dclWidth, dclHeight, dclTotalSize);
8713-
char* newDclName = kernel.fg.builder->getNameString(kernel.fg.builder->mem, 16, "copy_%d_%s", index, oldDcl->getName());
8714-
G4_Declare * newDcl = kernel.fg.builder->createDeclareNoLookup(newDclName, G4_GRF, dclWidth, dclHeight, oldSrc->getType());
8715-
newDcl->setAlign(oldDcl->getAlign());
8716-
newDcl->setSubRegAlign(oldDcl->getSubRegAlign());
8717-
unsigned newLeftBound = 0;
8708+
8709+
int numElt = getTypeSize(srcOpnd->getType()) > 4 ? 4 : (4 / getTypeSize(srcOpnd->getType()));
8710+
G4_Declare* newDcl = kernel.fg.builder->createTempVar(numElt * splitSize, srcOpnd->getType(), Either, Any);
87188711

87198712
for (size_t i = 0; i < splitDclList.size(); i++)
87208713
{
@@ -8725,32 +8718,16 @@ void VarSplit::insertMovesFromTemp(G4_Kernel& kernel, G4_Declare* oldDcl, int in
87258718
if (!(srcOpnd->getRightBound() < leftBound || rightBound < srcOpnd->getLeftBound()))
87268719
{
87278720

8728-
G4_DstRegRegion* dst = kernel.fg.builder->createDstRegRegion(Direct,
8729-
newDcl->getRegVar(),
8730-
newLeftBound / G4_GRF_REG_NBYTES,
8731-
0,
8732-
1,
8733-
oldSrc->getType());
8734-
newLeftBound += subDcl->getByteSize();
8735-
G4_SrcRegRegion* src = kernel.fg.builder->createSrcRegRegion(
8736-
Mod_src_undef,
8737-
Direct,
8738-
subDcl->getRegVar(),
8739-
0,
8740-
0,
8741-
kernel.fg.builder->getRegionStride1(),
8742-
oldSrc->getType());
8743-
G4_INST* movInst = kernel.fg.builder->createInternalInst(nullptr, G4_mov, nullptr, false,
8744-
(unsigned char)subDcl->getTotalElems(), dst, src, nullptr, InstOpt_WriteEnable,
8745-
inst->getLineNo(), inst->getCISAOff(), inst->getSrcFilename());
8746-
bb->insert(instIter, movInst);
8721+
newDcl->setAliasDeclare(subDcl, 0);
8722+
G4_SrcRegRegion* newSrc = kernel.fg.builder->Create_Src_Opnd_From_Dcl(newDcl, srcOpnd->getRegion());
8723+
newSrc->setRegOff(srcOpnd->getRegOff() % splitSize);
8724+
newSrc->setSubRegOff(srcOpnd->getSubRegOff());
8725+
newSrc->setModifier(srcOpnd->getModifier());
8726+
inst->setSrc(newSrc, pos);
8727+
break;
87478728
}
87488729
}
8749-
G4_SrcRegRegion* newSrc = kernel.fg.builder->Create_Src_Opnd_From_Dcl(newDcl, oldSrc->getRegion());
8750-
newSrc->setRegOff(0);
8751-
newSrc->setSubRegOff(oldSrc->getSubRegOff());
8752-
newSrc->setModifier(oldSrc->getModifier());
8753-
inst->setSrc(newSrc, pos);
8730+
87548731
}
87558732
else
87568733
{
@@ -8976,7 +8953,7 @@ void VarSplit::globalSplit(IR_Builder& builder, G4_Kernel &kernel)
89768953

89778954
if (opnd->isSrcRegRegion())
89788955
{
8979-
insertMovesFromTemp(kernel, topDcl, srcIndex, opnd, pos, bb, instIter, splitDclList);
8956+
insertMovesFromTemp(kernel, topDcl, srcIndex, opnd->asSrcRegRegion(), pos, bb, instIter, splitDclList);
89808957
}
89818958

89828959
srcIndex++;

visa/GraphColor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1248,7 +1248,7 @@ namespace vISA
12481248
static void getHeightWidth(G4_Type type, unsigned int numberElements, unsigned short &dclWidth, unsigned short &dclHeight, int &totalByteSize);
12491249
void createSubDcls(G4_Kernel& kernel, G4_Declare* oldDcl, std::vector<G4_Declare*> &splitDclList);
12501250
void insertMovesToTemp(IR_Builder& builder, G4_Declare* oldDcl, G4_Operand *dstOpnd, G4_BB* bb, INST_LIST_ITER instIter, std::vector<G4_Declare*> &splitDclList);
1251-
void insertMovesFromTemp(G4_Kernel& kernel, G4_Declare* oldDcl, int index, G4_Operand *srcOpnd, int pos, G4_BB* bb, INST_LIST_ITER instIter, std::vector<G4_Declare*> &splitDclList);
1251+
void insertMovesFromTemp(G4_Kernel& kernel, G4_Declare* oldDcl, int index, G4_SrcRegRegion *srcOpnd, int pos, G4_BB* bb, INST_LIST_ITER instIter, std::vector<G4_Declare*> &splitDclList);
12521252

12531253
public:
12541254
bool didLocalSplit = false;

0 commit comments

Comments
 (0)