Skip to content

Commit eb7d3be

Browse files
houjenkoigcbot
authored andcommitted
create alias of promoted arg to have correct type
create alias of promoted arg to have correct type
1 parent 62c6fdc commit eb7d3be

File tree

1 file changed

+56
-10
lines changed

1 file changed

+56
-10
lines changed

visa/BuildCISAIRImpl.cpp

Lines changed: 56 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -725,7 +725,6 @@ void CISA_IR_Builder::LinkTimeOptimization(
725725
{
726726
auto& calleeBuilder = callee->fg.builder;
727727
auto& callerBuilder = caller->fg.builder;
728-
const RegionDesc *rDesc = callerBuilder->getRegionStride1();
729728
replacedArgDcl = replacedArgDcl ?
730729
replacedArgDcl :
731730
callerBuilder->createDeclareNoLookup("newArg", G4_GRF, callerBuilder->numEltPerGRF<Type_UD>(), 32, Type_UD);
@@ -748,7 +747,7 @@ void CISA_IR_Builder::LinkTimeOptimization(
748747
replacedArgDcl->getRegVar(),
749748
src->asSrcRegRegion()->getRegOff(),
750749
src->asSrcRegRegion()->getSubRegOff(),
751-
rDesc,
750+
src->asSrcRegRegion()->getRegion(),
752751
src->getType());
753752
inst->setSrc(replacedArgSrc, i);
754753
}
@@ -771,24 +770,47 @@ void CISA_IR_Builder::LinkTimeOptimization(
771770
}
772771

773772
}
774-
for (G4_INST* inst : callerInsts)
773+
774+
// Trace backward from callsite to replace Arg with newArg
775+
auto rIt = it;
776+
rIt --;
777+
for (; rIt != callerInsts.begin(); --rIt)
775778
{
779+
G4_INST *inst = *rIt;
780+
if (inst->opcode() == G4_pseudo_fcall ||
781+
inst->opcode() == G4_call)
782+
{
783+
break;
784+
}
776785
G4_Operand *dst = inst->getDst();
777786
if (!dst) continue;
778787
G4_Declare* topDcl = dst->getTopDcl();
779788
if (!topDcl) continue;
780789
G4_Declare* rootDcl = topDcl->getRootDeclare();
781790
if (callerBuilder->isPreDefArg(rootDcl))
782791
{
792+
G4_Declare* dcl = dst->getBase()->asRegVar()->getDeclare();
793+
G4_Declare* newDcl = callerBuilder->createTempVar(dcl->getTotalElems(), dcl->getElemType(), Any, dcl->getName());
794+
newDcl->setAliasDeclare(replacedArgDcl, dcl->getAliasOffset());
783795
G4_DstRegRegion *replacedArgDst = callerBuilder->createDst(
784-
replacedArgDcl->getRegVar(),
796+
newDcl->getRegVar(),
785797
dst->asDstRegRegion()->getRegOff(),
786798
dst->asDstRegRegion()->getSubRegOff(),
787799
dst->asDstRegRegion()->getHorzStride(),
788800
dst->getType());
789801
inst->setDest(replacedArgDst);
790802
}
791-
803+
}
804+
auto fIt = it;
805+
fIt++;
806+
for (; fIt != callerInsts.end(); ++fIt)
807+
{
808+
G4_INST *inst = *fIt;
809+
if (inst->opcode() == G4_pseudo_fcall ||
810+
inst->opcode() == G4_call)
811+
{
812+
break;
813+
}
792814
for (int i = 0, numSrc = inst->getNumSrc(); i < numSrc; ++i)
793815
{
794816
G4_Operand *src = inst->getSrc(i);
@@ -802,7 +824,7 @@ void CISA_IR_Builder::LinkTimeOptimization(
802824
replacedRetDcl->getRegVar(),
803825
src->asSrcRegRegion()->getRegOff(),
804826
src->asSrcRegRegion()->getSubRegOff(),
805-
rDesc,
827+
src->asSrcRegRegion()->getRegion(),
806828
src->getType());
807829
inst->setSrc(replacedRetSrc, i);
808830
}
@@ -1132,9 +1154,8 @@ void CISA_IR_Builder::LinkTimeOptimization(
11321154
}
11331155
else if (topDcl && (topDcl == replacedArgDcl || topDcl == replacedRetDcl))
11341156
{
1135-
G4_Declare* newDcl = caller->fg.builder->createTempVar(topDcl->getTotalElems(), topDcl->getElemType(), Any, topDcl->getName());
1136-
newDcl->setAliasDeclare(topDcl, 0);
1137-
caller->Declares.push_back(newDcl);
1157+
G4_Declare* newDcl = caller->fg.builder->createTempVar(dcl->getTotalElems(), dcl->getElemType(), Any, dcl->getName());
1158+
newDcl->setAliasDeclare(topDcl, dcl->getAliasOffset());
11381159
}
11391160
else
11401161
{
@@ -1152,6 +1173,7 @@ void CISA_IR_Builder::LinkTimeOptimization(
11521173
}
11531174
}
11541175
};
1176+
std::map<G4_Label*, G4_Label*> labelMap;
11551177
if (inlining)
11561178
{
11571179
auto& builder = caller->fg.builder;
@@ -1160,13 +1182,37 @@ void CISA_IR_Builder::LinkTimeOptimization(
11601182
G4_INST* ra = caller->fg.createNewLabelInst(raLabel);
11611183
// We don't need calleeLabel (first instruction) anymore after inlining
11621184
calleeInsts.pop_front();
1185+
// Iterate once to clone labels
1186+
for (G4_INST* inst : calleeInsts)
1187+
{
1188+
if (inst->opcode() == G4_label)
1189+
{
1190+
std::string name = inst->getSrc(0)->asLabel()->getLabel();
1191+
G4_Label *newLabel = builder->createLabel(name + "_" + std::to_string(funcUID), LABEL_BLOCK);
1192+
labelMap[inst->getSrc(0)->asLabel()] = newLabel;
1193+
}
1194+
}
1195+
1196+
// clone instructions
11631197
for (G4_INST* fret : calleeInsts)
11641198
{
1165-
G4_INST* inst = fret->cloneInst();
1199+
G4_INST* inst = nullptr;
1200+
if (fret->opcode() == G4_label)
1201+
{
1202+
inst = caller->fg.createNewLabelInst(labelMap[fret->getSrc(0)->asLabel()]);
1203+
}
1204+
else
1205+
{
1206+
inst = fret->cloneInst();
1207+
}
11661208
for (int i = 0, numSrc = inst->getNumSrc(); i < numSrc; ++i)
11671209
{
11681210
cloneDcl(inst->getSrc(i));
11691211
}
1212+
if (inst->opcode() == G4_goto)
1213+
{
1214+
inst->asCFInst()->setUip(labelMap[fret->asCFInst()->getUip()]);
1215+
}
11701216
cloneDcl(inst->getDst());
11711217
cloneDcl(inst->getPredicate());
11721218
// add predicate into declaration list

0 commit comments

Comments
 (0)