@@ -9281,13 +9281,15 @@ void EmitPass::EmitGenIntrinsicMessage(llvm::GenIntrinsicInst* inst)
92819281 emitLoadRawIndexed(
92829282 cast<LdRawIntrinsic>(inst),
92839283 cast<LdRawIntrinsic>(inst)->getOffsetValue(),
9284+ nullptr,
92849285 nullptr);
92859286 break;
92869287 case GenISAIntrinsic::GenISA_storerawvector_indexed:
92879288 case GenISAIntrinsic::GenISA_storeraw_indexed:
92889289 emitStoreRawIndexed(
92899290 cast<StoreRawIntrinsic>(inst),
92909291 cast<StoreRawIntrinsic>(inst)->getOffsetValue(),
9292+ nullptr,
92919293 nullptr);
92929294 break;
92939295 case GenISAIntrinsic::GenISA_GetBufferPtr:
@@ -11104,11 +11106,13 @@ void EmitPass::setRovCacheCtrl(GenIntrinsicInst* inst)
1110411106}
1110511107
1110611108void EmitPass::emitLoadRawIndexed(
11107- LdRawIntrinsic * inst, Value * varOffset, ConstantInt * immOffset)
11109+ LdRawIntrinsic* inst,
11110+ Value* varOffset,
11111+ ConstantInt* immScale,
11112+ ConstantInt* immOffset)
1110811113{
1110911114 Value* bufPtrv = inst->getResourceValue();
1111011115
11111- ResourceDescriptor resource = GetResourceVariable(bufPtrv);
1111211116 LSC_DOC_ADDR_SPACE addrSpace = m_pCtx->getUserAddrSpaceMD().Get(inst);
1111311117 m_currShader->m_State.isMessageTargetDataCacheDataPort = true;
1111411118 if (shouldGenerateLSC(inst))
@@ -11124,13 +11128,14 @@ void EmitPass::emitLoadRawIndexed(
1112411128 bufPtrv,
1112511129 varOffset,
1112611130 immOffset,
11127- nullptr ,
11131+ immScale ,
1112811132 cacheOpts,
1112911133 addrSpace
1113011134 );
1113111135 return;
1113211136 }
1113311137 IGC_ASSERT(immOffset == nullptr);
11138+ ResourceDescriptor resource = GetResourceVariable(bufPtrv);
1113411139 emitLoad3DInner(inst, resource, varOffset);
1113511140}
1113611141
@@ -12594,7 +12599,10 @@ void EmitPass::emitSymbolRelocation(Function& F)
1259412599}
1259512600
1259612601void EmitPass::emitStoreRawIndexed(
12597- StoreRawIntrinsic* inst, Value* varOffset, ConstantInt* immOffset)
12602+ StoreRawIntrinsic* inst,
12603+ Value* varOffset,
12604+ ConstantInt* immScale,
12605+ ConstantInt* immOffset)
1259812606{
1259912607 Value* pBufPtr = inst->getResourceValue();
1260012608 Value* pValToStore = inst->getStoreValue();
@@ -12611,7 +12619,7 @@ void EmitPass::emitStoreRawIndexed(
1261112619 pBufPtr,
1261212620 varOffset,
1261312621 immOffset,
12614- nullptr ,
12622+ immScale ,
1261512623 pValToStore,
1261612624 inst->getParent(),
1261712625 cacheOpts,
@@ -19656,7 +19664,7 @@ void EmitPass::emitLSCVectorLoad(Instruction* inst,
1965619664 else if (auto CI = dyn_cast<LdRawIntrinsic>(inst))
1965719665 align = CI->getAlignment();
1965819666 PointerType* ptrType = cast<PointerType>(Ptr->getType());
19659- ResourceDescriptor resource = GetResourceVariable(Ptr);
19667+ ResourceDescriptor resource = GetResourceVariable(Ptr, true );
1966019668 bool useA32 = !IGC::isA64Ptr(ptrType, m_currShader->GetContext());
1966119669 LSC_ADDR_SIZE addrSize = useA32 ? LSC_ADDR_SIZE_32b : LSC_ADDR_SIZE_64b;
1966219670 IGCLLVM::FixedVectorType* VTy = dyn_cast<IGCLLVM::FixedVectorType>(Ty);
@@ -19991,7 +19999,7 @@ void EmitPass::emitLSCVectorStore(Value *Ptr,
1999119999
1999220000 unsigned int width = numLanes(m_currShader->m_SIMDSize);
1999320001
19994- ResourceDescriptor resource = GetResourceVariable(Ptr);
20002+ ResourceDescriptor resource = GetResourceVariable(Ptr, true );
1999520003 CountStatelessIndirectAccess(Ptr, resource);
1999620004 if (ptrType->getPointerAddressSpace() != ADDRESS_SPACE_PRIVATE &&
1999720005 !dontForceDmask)
@@ -21658,7 +21666,7 @@ void EmitPass::emitGetBufferPtr(GenIntrinsicInst* inst)
2165821666 m_currShader->SetBindingTableEntryCountAndBitmap(directIdx, bufType, 0, bti);
2165921667}
2166021668
21661- ResourceDescriptor EmitPass::GetResourceVariable(Value* resourcePtr)
21669+ ResourceDescriptor EmitPass::GetResourceVariable(Value* resourcePtr, bool Check )
2166221670{
2166321671 ResourceDescriptor resource;
2166421672 BufferType bufType = BUFFER_TYPE_UNKNOWN;
@@ -21686,15 +21694,14 @@ ResourceDescriptor EmitPass::GetResourceVariable(Value* resourcePtr)
2168621694 if (IsBindless(bufType) ||
2168721695 !directIndexing)
2168821696 {
21689- if (isa<IntToPtrInst>(resourcePtr))
21690- {
21691- IntToPtrInst* i2p = dyn_cast<IntToPtrInst>(resourcePtr);
21692- resource.m_resource = GetSymbol(i2p->getOperand(0));
21693- }
21694- else
21695- {
21696- resource.m_resource = GetSymbol(resourcePtr);
21697- }
21697+ auto SetResource = [&](Value* resourcePtr) {
21698+ if (auto* i2p = dyn_cast<IntToPtrInst>(resourcePtr))
21699+ resource.m_resource = GetSymbol(i2p->getOperand(0));
21700+ else
21701+ resource.m_resource = GetSymbol(resourcePtr);
21702+ };
21703+
21704+ SetResource(resourcePtr);
2169821705
2169921706 if (resource.m_resource->GetElemSize() < 4)
2170021707 {
0 commit comments