prepare for supporting load combining

Add support in emit pass/dessa/wianalysis to support load combining that
uses struct for combining.

As load combining is off, this change has no functional issue.
This commit is contained in:
Gu, Junjie
2023-12-23 01:06:48 +00:00
committed by igcbot
parent bd4058a36c
commit 65bc729c5d
4 changed files with 101 additions and 36 deletions

View File

@ -697,16 +697,25 @@ void DeSSA::CoalesceAliasInst()
{
if (GenIntrinsicInst* GII = dyn_cast<GenIntrinsicInst>(I))
{
if (GII->getIntrinsicID() == GenISAIntrinsic::GenISA_bitcastfromstruct &&
auto GIIid = GII->getIntrinsicID();
if ((GIIid == GenISAIntrinsic::GenISA_bitcastfromstruct ||
GIIid == GenISAIntrinsic::GenISA_bitcasttostruct) &&
!isa<Constant>(GII->getOperand(0)))
{
// special cast just for load/store.
Value* D = GII;
Value* S = GII->getOperand(0);
// D must be int or int vector type; S must be struct type.
IGC_ASSERT(D->getType()->getScalarType()->isIntegerTy());
IGC_ASSERT(S->getType()->isStructTy());
if (GIIid == GenISAIntrinsic::GenISA_bitcastfromstruct) {
// D must be int or int vector type; S must be struct type.
IGC_ASSERT(D->getType()->getScalarType()->isIntegerTy());
IGC_ASSERT(S->getType()->isStructTy());
}
else if (GIIid == GenISAIntrinsic::GenISA_bitcasttostruct) {
// S must be int or int vector type; D must be struct type.
IGC_ASSERT(S->getType()->getScalarType()->isIntegerTy());
IGC_ASSERT(D->getType()->isStructTy());
}
AddAlias(S);
Value* aliasee = AliasMap[S];