Skip to content

Commit 31e8bf9

Browse files
committed
Changes in code.
Change-Id: Ieacfb8e4c2d4bd3166fc53ab5708b998de1e1918
1 parent 8feeb0e commit 31e8bf9

File tree

2 files changed

+142
-43
lines changed

2 files changed

+142
-43
lines changed

IGC/Compiler/CISACodeGen/helper.cpp

Lines changed: 141 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,147 @@ bool GetResourcePointerInfo(Value* srcPtr, unsigned &resID, IGC::BufferType &res
522522
return false;
523523
}
524524

525+
///
526+
/// Wrapper method for changing PTRType for PromoteToBindless Pass.
527+
/// Replaces oldPtr with newPtr in a sample/ld intrinsic's argument list. The new instrinsic will
528+
/// replace the old one in the module
529+
///
530+
void ChangePtrTypeInIntrinsic(llvm::GenIntrinsicInst *&pIntr, llvm::Value* oldPtr, llvm::Value* newPtr, bool isExtendedForBindlessPromotion)
531+
{
532+
llvm::Module *pModule = pIntr->getParent()->getParent()->getParent();
533+
llvm::Function *pCalledFunc = pIntr->getCalledFunction();
534+
535+
// Look at the intrinsic and figure out which pointer to change
536+
int num_ops = pIntr->getNumArgOperands();
537+
llvm::SmallVector<llvm::Value*, 5> args;
538+
539+
for (int i = 0; i < num_ops; ++i)
540+
{
541+
if (pIntr->getArgOperand(i) == oldPtr)
542+
args.push_back(newPtr);
543+
else
544+
args.push_back(pIntr->getArgOperand(i));
545+
}
546+
547+
llvm::Function *pNewIntr = nullptr;
548+
llvm::SmallVector<llvm::Type*, 4> overloadedTys;
549+
GenISAIntrinsic::ID id = pIntr->getIntrinsicID();
550+
551+
bool isPointerChangedInFallbackMethod = false;
552+
553+
switch (id)
554+
{
555+
case llvm::GenISAIntrinsic::GenISA_ldmcsptr:
556+
case llvm::GenISAIntrinsic::GenISA_ldptr:
557+
case llvm::GenISAIntrinsic::GenISA_ldmsptr:
558+
case llvm::GenISAIntrinsic::GenISA_resinfoptr:
559+
case llvm::GenISAIntrinsic::GenISA_readsurfaceinfoptr:
560+
case llvm::GenISAIntrinsic::GenISA_sampleinfoptr:
561+
case llvm::GenISAIntrinsic::GenISA_sampleptr:
562+
case llvm::GenISAIntrinsic::GenISA_sampleBptr:
563+
case llvm::GenISAIntrinsic::GenISA_sampleCptr:
564+
case llvm::GenISAIntrinsic::GenISA_sampleDptr:
565+
case llvm::GenISAIntrinsic::GenISA_sampleLptr:
566+
case llvm::GenISAIntrinsic::GenISA_sampleBCptr:
567+
case llvm::GenISAIntrinsic::GenISA_sampleDCptr:
568+
case llvm::GenISAIntrinsic::GenISA_sampleLCptr:
569+
case llvm::GenISAIntrinsic::GenISA_gather4ptr:
570+
case llvm::GenISAIntrinsic::GenISA_gather4POptr:
571+
case llvm::GenISAIntrinsic::GenISA_gather4Cptr:
572+
case llvm::GenISAIntrinsic::GenISA_gather4POCptr:
573+
case llvm::GenISAIntrinsic::GenISA_lodptr:
574+
case llvm::GenISAIntrinsic::GenISA_typedread:
575+
case llvm::GenISAIntrinsic::GenISA_typedwrite:
576+
case llvm::GenISAIntrinsic::GenISA_intatomicraw:
577+
case llvm::GenISAIntrinsic::GenISA_icmpxchgatomicraw:
578+
case llvm::GenISAIntrinsic::GenISA_intatomicrawA64:
579+
case llvm::GenISAIntrinsic::GenISA_icmpxchgatomicrawA64:
580+
581+
// fallback to not extended version
582+
ChangePtrTypeInIntrinsic(pIntr, oldPtr, newPtr);
583+
isPointerChangedInFallbackMethod = true;
584+
break;
585+
586+
case llvm::GenISAIntrinsic::GenISA_floatatomicraw:
587+
case llvm::GenISAIntrinsic::GenISA_floatatomicrawA64:
588+
case llvm::GenISAIntrinsic::GenISA_fcmpxchgatomicraw:
589+
case llvm::GenISAIntrinsic::GenISA_fcmpxchgatomicrawA64:
590+
591+
overloadedTys.push_back(pIntr->getType());
592+
overloadedTys.push_back(newPtr->getType());
593+
if (id == GenISAIntrinsic::GenISA_intatomicrawA64)
594+
{
595+
args[0] = args[1];
596+
args[1] = CastInst::CreatePointerCast(args[1], Type::getInt32Ty(pModule->getContext()), "", pIntr);
597+
id = GenISAIntrinsic::GenISA_intatomicraw;
598+
}
599+
else if (id == GenISAIntrinsic::GenISA_icmpxchgatomicrawA64)
600+
{
601+
args[0] = args[1];
602+
args[1] = CastInst::CreatePointerCast(args[1], Type::getInt32Ty(pModule->getContext()), "", pIntr);
603+
id = GenISAIntrinsic::GenISA_icmpxchgatomicraw;
604+
}
605+
else if (id == GenISAIntrinsic::GenISA_floatatomicrawA64)
606+
{
607+
args[0] = args[1];
608+
args[1] = CastInst::CreatePointerCast(args[1], Type::getFloatTy(pModule->getContext()), "", pIntr);
609+
id = GenISAIntrinsic::GenISA_floatatomicraw;
610+
}
611+
else if (id == GenISAIntrinsic::GenISA_fcmpxchgatomicrawA64)
612+
{
613+
args[0] = args[1];
614+
args[1] = CastInst::CreatePointerCast(args[1], Type::getFloatTy(pModule->getContext()), "", pIntr);
615+
id = GenISAIntrinsic::GenISA_fcmpxchgatomicraw;
616+
}
617+
break;
618+
case llvm::GenISAIntrinsic::GenISA_dwordatomicstructured:
619+
case llvm::GenISAIntrinsic::GenISA_floatatomicstructured:
620+
case llvm::GenISAIntrinsic::GenISA_cmpxchgatomicstructured:
621+
case llvm::GenISAIntrinsic::GenISA_fcmpxchgatomicstructured:
622+
overloadedTys.push_back(pIntr->getType());
623+
overloadedTys.push_back(args[0]->getType());
624+
break;
625+
case GenISAIntrinsic::GenISA_intatomictyped:
626+
case GenISAIntrinsic::GenISA_icmpxchgatomictyped:
627+
overloadedTys.push_back(newPtr->getType());
628+
break;
629+
case GenISAIntrinsic::GenISA_atomiccounterinc:
630+
case GenISAIntrinsic::GenISA_atomiccounterpredec:
631+
overloadedTys.push_back(pIntr->getType());
632+
overloadedTys.push_back(args[0]->getType());
633+
break;
634+
//case llvm::GenISAIntrinsic::GenISA_ldrawvector_indexed:
635+
case llvm::GenISAIntrinsic::GenISA_ldraw_indexed:
636+
overloadedTys.push_back(pCalledFunc->getReturnType());
637+
overloadedTys.push_back(newPtr->getType());
638+
break;
639+
case llvm::GenISAIntrinsic::GenISA_storeraw_indexed:
640+
overloadedTys.push_back(newPtr->getType());
641+
overloadedTys.push_back(args[2]->getType());
642+
643+
break;
644+
default:
645+
assert(0 && "Unknown intrinsic encountered while changing pointer types");
646+
break;
647+
}
648+
649+
// if processed by this method, let's replace instruction here.
650+
if ( !isPointerChangedInFallbackMethod )
651+
{
652+
pNewIntr = llvm::GenISAIntrinsic::getDeclaration(
653+
pModule,
654+
id,
655+
overloadedTys);
656+
657+
llvm::CallInst *pNewCall = llvm::CallInst::Create(pNewIntr, args, "", pIntr);
658+
659+
pIntr->replaceAllUsesWith(pNewCall);
660+
pIntr->eraseFromParent();
661+
662+
pIntr = llvm::cast<llvm::GenIntrinsicInst>(pNewCall);
663+
}
664+
}
665+
525666
///
526667
/// Replaces oldPtr with newPtr in a sample/ld intrinsic's argument list. The new instrinsic will
527668
/// replace the old one in the module
@@ -609,11 +750,6 @@ void ChangePtrTypeInIntrinsic(llvm::GenIntrinsicInst *&pIntr, llvm::Value* oldPt
609750
case llvm::GenISAIntrinsic::GenISA_icmpxchgatomicraw:
610751
case llvm::GenISAIntrinsic::GenISA_intatomicrawA64:
611752
case llvm::GenISAIntrinsic::GenISA_icmpxchgatomicrawA64:
612-
case llvm::GenISAIntrinsic::GenISA_floatatomicraw:
613-
case llvm::GenISAIntrinsic::GenISA_floatatomicrawA64:
614-
case llvm::GenISAIntrinsic::GenISA_fcmpxchgatomicraw:
615-
case llvm::GenISAIntrinsic::GenISA_fcmpxchgatomicrawA64:
616-
617753
overloadedTys.push_back(pIntr->getType());
618754
overloadedTys.push_back(newPtr->getType());
619755
if(id == GenISAIntrinsic::GenISA_intatomicrawA64)
@@ -628,44 +764,6 @@ void ChangePtrTypeInIntrinsic(llvm::GenIntrinsicInst *&pIntr, llvm::Value* oldPt
628764
args[1] = CastInst::CreatePointerCast(args[1], Type::getInt32Ty(pModule->getContext()), "", pIntr);
629765
id = GenISAIntrinsic::GenISA_icmpxchgatomicraw;
630766
}
631-
else if (id == GenISAIntrinsic::GenISA_floatatomicrawA64)
632-
{
633-
args[0] = args[1];
634-
args[1] = CastInst::CreatePointerCast(args[1], Type::getFloatTy(pModule->getContext()), "", pIntr);
635-
id = GenISAIntrinsic::GenISA_floatatomicraw;
636-
}
637-
else if (id == GenISAIntrinsic::GenISA_fcmpxchgatomicrawA64)
638-
{
639-
args[0] = args[1];
640-
args[1] = CastInst::CreatePointerCast(args[1], Type::getFloatTy(pModule->getContext()), "", pIntr);
641-
id = GenISAIntrinsic::GenISA_fcmpxchgatomicraw;
642-
}
643-
break;
644-
case llvm::GenISAIntrinsic::GenISA_dwordatomicstructured:
645-
case llvm::GenISAIntrinsic::GenISA_floatatomicstructured:
646-
case llvm::GenISAIntrinsic::GenISA_cmpxchgatomicstructured:
647-
case llvm::GenISAIntrinsic::GenISA_fcmpxchgatomicstructured:
648-
overloadedTys.push_back(pIntr->getType());
649-
overloadedTys.push_back(args[0]->getType());
650-
break;
651-
case GenISAIntrinsic::GenISA_intatomictyped:
652-
case GenISAIntrinsic::GenISA_icmpxchgatomictyped:
653-
overloadedTys.push_back(newPtr->getType());
654-
break;
655-
case GenISAIntrinsic::GenISA_atomiccounterinc:
656-
case GenISAIntrinsic::GenISA_atomiccounterpredec:
657-
overloadedTys.push_back(pIntr->getType());
658-
overloadedTys.push_back(args[0]->getType());
659-
break;
660-
//case llvm::GenISAIntrinsic::GenISA_ldrawvector_indexed:
661-
case llvm::GenISAIntrinsic::GenISA_ldraw_indexed:
662-
overloadedTys.push_back(pCalledFunc->getReturnType());
663-
overloadedTys.push_back(newPtr->getType());
664-
break;
665-
case llvm::GenISAIntrinsic::GenISA_storeraw_indexed:
666-
overloadedTys.push_back(newPtr->getType());
667-
overloadedTys.push_back(args[2]->getType());
668-
669767
break;
670768
default:
671769
assert(0 && "Unknown intrinsic encountered while changing pointer types");

IGC/Compiler/CISACodeGen/helper.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ llvm::Value* CreateLoadRawIntrinsic(llvm::LoadInst *inst, llvm::Instruction* buf
139139
llvm::Value* CreateStoreRawIntrinsic(llvm::StoreInst *inst, llvm::Instruction* bufPtr, llvm::Value* offsetVal);
140140

141141
void getTextureAndSamplerOperands(llvm::GenIntrinsicInst *pIntr, llvm::Value*& pTextureValue, llvm::Value*& pSamplerValue);
142+
void ChangePtrTypeInIntrinsic(llvm::GenIntrinsicInst *&pIntr, llvm::Value* oldPtr, llvm::Value* newPtr, bool isExtendedForBindlessPromotion);
142143
void ChangePtrTypeInIntrinsic(llvm::GenIntrinsicInst *&pIntr, llvm::Value* oldPtr, llvm::Value* newPtr);
143144

144145
llvm::Value* TracePointerSource(llvm::Value* resourcePtr);

0 commit comments

Comments
 (0)