@@ -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" );
0 commit comments