Skip to content

Commit 513f91d

Browse files
mateuszchudykigcbot
authored andcommitted
Force use of Bindful mode for specific kernels
Force use of Bindful mode for specific kernels
1 parent 06bca29 commit 513f91d

File tree

5 files changed

+44
-8
lines changed

5 files changed

+44
-8
lines changed

IGC/AdaptorCommon/AddImplicitArgs.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ SPDX-License-Identifier: MIT
1414
#include "Compiler/DebugInfo/ScalarVISAModule.h"
1515
#include "Compiler/Optimizer/OCLBIUtils.h"
1616
#include "Compiler/MetaDataApi/IGCMetaDataHelper.h"
17+
#include "Compiler/Optimizer/OpenCLPasses/StatelessToStateful/StatelessToStateful.hpp"
1718
#include "LLVM3DBuilder/MetadataBuilder.h"
1819

1920
#include "common/LLVMWarningsPush.hpp"
@@ -104,7 +105,8 @@ bool AddImplicitArgs::runOnModule(Module &M)
104105
}
105106

106107
if (ctx->getModuleMetaData()->compOpt.UseBindlessMode &&
107-
!ctx->getModuleMetaData()->compOpt.UseLegacyBindlessMode)
108+
!ctx->getModuleMetaData()->compOpt.UseLegacyBindlessMode &&
109+
!StatelessToStateful::WA_ForcedUsedOfBindfulMode(func))
108110
{
109111
ImplicitArgs::addBindlessOffsetArgs(func, m_pMdUtils, ctx->getModuleMetaData());
110112
}

IGC/Compiler/Optimizer/OpenCLPasses/StatelessToStateful/StatelessToStateful.cpp

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,7 @@ void StatelessToStateful::promoteIntrinsic(InstructionInfo& II)
566566
GenISAIntrinsic::ID const intrinID = I->getIntrinsicID();
567567
PointerType* pTy = IGCLLVM::getWithSamePointeeType(dyn_cast<PointerType>(II.ptr->getType()), II.getStatefulAddrSpace());
568568

569-
if (m_targetAddressing == TargetAddressing::BINDLESS)
569+
if (m_targetAddressing == TargetAddressing::BINDLESS && !WA_ForcedUsedOfBindfulMode(*m_F))
570570
{
571571
Argument* srcOffset = m_pImplicitArgs->getNumberedImplicitArg(*m_F, ImplicitArg::BINDLESS_OFFSET, II.getBaseArgIndex());
572572
auto newBasePtr = IntToPtrInst::Create(Instruction::IntToPtr, srcOffset, pTy, "", I);
@@ -593,7 +593,7 @@ void StatelessToStateful::promoteIntrinsic(InstructionInfo& II)
593593
return;
594594
}
595595

596-
IGC_ASSERT(m_targetAddressing == TargetAddressing::BINDFUL);
596+
IGC_ASSERT(m_targetAddressing == TargetAddressing::BINDFUL || WA_ForcedUsedOfBindfulMode(*m_F));
597597

598598
Instruction* statefulPtr = IntToPtrInst::Create(Instruction::IntToPtr, II.offset, pTy, "", I);
599599
Instruction* statefulInst = nullptr;
@@ -684,7 +684,7 @@ void StatelessToStateful::promoteLoad(InstructionInfo& II)
684684

685685
const DebugLoc& DL = I->getDebugLoc();
686686

687-
if (m_targetAddressing == TargetAddressing::BINDLESS)
687+
if (m_targetAddressing == TargetAddressing::BINDLESS && !WA_ForcedUsedOfBindfulMode(*m_F))
688688
{
689689
Argument* srcOffset = m_pImplicitArgs->getNumberedImplicitArg(*m_F, ImplicitArg::BINDLESS_OFFSET, II.getBaseArgIndex());
690690
auto newBasePtr = IntToPtrInst::Create(Instruction::IntToPtr, srcOffset, pTy, "", I);
@@ -696,7 +696,7 @@ void StatelessToStateful::promoteLoad(InstructionInfo& II)
696696
I->replaceAllUsesWith(bindlessLoad);
697697
I->eraseFromParent();
698698
}
699-
else if (m_targetAddressing == TargetAddressing::BINDFUL)
699+
else if (m_targetAddressing == TargetAddressing::BINDFUL || WA_ForcedUsedOfBindfulMode(*m_F))
700700
{
701701
auto newBasePtr = IntToPtrInst::Create(Instruction::IntToPtr, II.offset, pTy, "", I);
702702
auto bindfulLoad = new LoadInst(
@@ -738,7 +738,7 @@ void StatelessToStateful::promoteStore(InstructionInfo& II)
738738

739739
const DebugLoc& DL = I->getDebugLoc();
740740

741-
if (m_targetAddressing == TargetAddressing::BINDLESS)
741+
if (m_targetAddressing == TargetAddressing::BINDLESS && !WA_ForcedUsedOfBindfulMode(*m_F))
742742
{
743743
Argument* srcOffset = m_pImplicitArgs->getNumberedImplicitArg(*m_F, ImplicitArg::BINDLESS_OFFSET, II.getBaseArgIndex());
744744
auto newBasePtr = IntToPtrInst::Create(Instruction::IntToPtr, srcOffset, pTy, "", I);
@@ -749,7 +749,7 @@ void StatelessToStateful::promoteStore(InstructionInfo& II)
749749

750750
I->eraseFromParent();
751751
}
752-
else if (m_targetAddressing == TargetAddressing::BINDFUL)
752+
else if (m_targetAddressing == TargetAddressing::BINDFUL || WA_ForcedUsedOfBindfulMode(*m_F))
753753
{
754754
auto newBasePtr = IntToPtrInst::Create(Instruction::IntToPtr, II.offset, pTy, "", I);
755755
auto bindfulStore = new StoreInst(
@@ -804,7 +804,7 @@ void StatelessToStateful::promote()
804804
IGC_ASSERT(bufferPos < maxPromotionCount);
805805

806806
unsigned statefullAddrspace = 0;
807-
if (m_targetAddressing == TargetAddressing::BINDLESS)
807+
if (m_targetAddressing == TargetAddressing::BINDLESS && !WA_ForcedUsedOfBindfulMode(*m_F))
808808
{
809809
statefullAddrspace =
810810
IGC::EncodeAS4GFXResource(
@@ -989,6 +989,15 @@ void StatelessToStateful::visitStoreInst(StoreInst& I)
989989
}
990990
}
991991

992+
bool StatelessToStateful::WA_ForcedUsedOfBindfulMode(const Function& F)
993+
{
994+
static const std::array kernels{
995+
"_ZTSZ42oneapi_kernel_integrator_intersect_closestP16KernelGlobalsGPUyyRN4sycl3_V17handlerEPKiPfiEUlNS2_7nd_itemILi1EEENS2_14kernel_handlerEE_",
996+
};
997+
998+
return std::any_of(kernels.begin(), kernels.end(), [&F](const auto& it) { return it == F.getName(); });
999+
}
1000+
9921001
void StatelessToStateful::findPromotableInstructions()
9931002
{
9941003
// fill m_promotionMap

IGC/Compiler/Optimizer/OpenCLPasses/StatelessToStateful/StatelessToStateful.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ namespace IGC
6363
void visitStoreInst(llvm::StoreInst& I);
6464
void visitCallInst(llvm::CallInst& I);
6565

66+
static bool WA_ForcedUsedOfBindfulMode(const llvm::Function& F);
67+
6668
private:
6769
struct InstructionInfo {
6870
InstructionInfo(llvm::Instruction* I, llvm::Value* ptr, llvm::Value* offset):

IGC/Compiler/SPIRMetaDataTranslation.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,26 @@ bool SPIRMetaDataTranslation::runOnModule(Module& M)
393393

394394
pIgcMDUtils->save(M.getContext());
395395

396+
WA_ForceUseBindfulModeIfSpecificKernelExistsInModule(M);
397+
396398
return true;
397399
}
398400

401+
void SPIRMetaDataTranslation::WA_ForceUseBindfulModeIfSpecificKernelExistsInModule(Module& M)
402+
{
403+
bool forceUseBindful = std::any_of(M.begin(), M.end(), [](auto const& it) { return StatelessToStateful::WA_ForcedUsedOfBindfulMode(it); });
404+
if (forceUseBindful)
405+
{
406+
auto modMD = getAnalysis<MetaDataUtilsWrapper>().getModuleMetaData();
407+
auto ctx = getAnalysis<CodeGenContextWrapper>().getCodeGenContext();
408+
auto clContext = static_cast<OpenCLProgramContext*>(ctx);
409+
auto internalOptions = const_cast<InternalOptions*>(&clContext->m_InternalOptions);
410+
411+
modMD->compOpt.UseBindlessMode = false;
412+
modMD->compOpt.UseLegacyBindlessMode = true;
413+
414+
internalOptions->UseBindlessMode = false;
415+
internalOptions->UseBindlessLegacyMode = true;
416+
internalOptions->PromoteStatelessToBindless = false;
417+
}
418+
}

IGC/Compiler/SPIRMetaDataTranslation.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ SPDX-License-Identifier: MIT
1010

1111
#include "Compiler/CodeGenContextWrapper.hpp"
1212
#include "Compiler/MetaDataUtilsWrapper.h"
13+
#include "Compiler/Optimizer/OpenCLPasses/StatelessToStateful/StatelessToStateful.hpp"
1314
#include "common/LLVMWarningsPush.hpp"
1415
#include <llvm/Pass.h>
1516
#include "common/LLVMWarningsPop.hpp"
@@ -38,6 +39,8 @@ namespace IGC
3839
AU.addRequired<MetaDataUtilsWrapper>();
3940
}
4041

42+
private:
43+
void WA_ForceUseBindfulModeIfSpecificKernelExistsInModule(llvm::Module& M);
4144
};
4245

4346
} // namespace IGC

0 commit comments

Comments
 (0)