Skip to content

Commit 765b6d1

Browse files
jgu222igcbot
authored andcommitted
[OCL]Need some cleanup before retry.
CShaderProgram has llvm::Function ptr as its field. Right before retry, the existing module is deleted, so all of its functions are deleted as well. This is to make sure those function ptr is set to null to avoid dangling function ptr. Also, for kernels that need retry, its CShaderPrograms need to be freed to avoid memory leak. Don't exxpect any functional change.
1 parent f891ebf commit 765b6d1

File tree

6 files changed

+42
-0
lines changed

6 files changed

+42
-0
lines changed

IGC/AdaptorOCL/OCL/sp/spp_g8.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,13 @@ CGen8OpenCLProgram::~CGen8OpenCLProgram()
137137
m_ShaderProgramList.clear();
138138
}
139139

140+
void CGen8OpenCLProgram::clearBeforeRetry()
141+
{
142+
for (auto P : m_ShaderProgramList) {
143+
P->clearBeforeRetry();
144+
}
145+
}
146+
140147
RETVAL CGen8OpenCLProgramBase::GetProgramDebugData(Util::BinaryStream& programDebugData)
141148
{
142149
// Used by VC only

IGC/AdaptorOCL/OCL/sp/spp_g8.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ class CGen8OpenCLProgram : public CGen8OpenCLProgramBase
9898
// Used to track the kernel info from CodeGen
9999
std::vector<IGC::CShaderProgram*> m_ShaderProgramList;
100100

101+
// invoked when the current module is deleted to avoid dangling Function ptr.
102+
void clearBeforeRetry();
103+
101104
private:
102105

103106
class CLProgramCtxProvider : public CGen8OpenCLStateProcessor::IProgramContext {

IGC/AdaptorOCL/dllInterfaceCompute.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1452,6 +1452,7 @@ bool TranslateBuildSPMD(
14521452
{
14531453
splitter.retry();
14541454
kernelFunctions.clear();
1455+
oclContext.clearBeforeRetry();
14551456
oclContext.clear();
14561457

14571458
// Create a new LLVMContext

IGC/Compiler/CISACodeGen/OpenCLKernelCodeGen.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2787,6 +2787,8 @@ namespace IGC
27872787
// Clear the retry set and collect kernels for retry in the loop below.
27882788
ctx->m_retryManager.kernelSet.clear();
27892789

2790+
// If kernel needs retry, its shaderProgram should be deleted
2791+
SmallVector<CShaderProgram*, 8> toBeDeleted;
27902792
// gather data to send back to the driver
27912793
for (const auto& k : shaders)
27922794
{
@@ -2817,6 +2819,20 @@ namespace IGC
28172819
else if (COpenCLKernel::IsValidShader(simd8Shader))
28182820
GatherDataForDriver(ctx, simd8Shader, pKernel, pFunc, pMdUtils, SIMDMode::SIMD8);
28192821
}
2822+
2823+
if (ctx->m_programOutput.m_ShaderProgramList.empty() ||
2824+
(ctx->m_programOutput.m_ShaderProgramList.back() != pKernel))
2825+
{
2826+
// This CShaderProgram needs rebuilding in retry run.
2827+
toBeDeleted.push_back(pKernel);
2828+
}
2829+
}
2830+
2831+
for (int i=0, sz = (int)toBeDeleted.size(); i < sz; ++i)
2832+
{
2833+
CShaderProgram* SP = toBeDeleted[i];
2834+
shaders.erase(SP->getLLVMFunction());
2835+
delete SP;
28202836
}
28212837

28222838
// The skip set to avoid retry is not needed. Clear it and collect a new set

IGC/Compiler/CISACodeGen/ShaderCodeGen.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,8 +732,19 @@ class CShaderProgram
732732
void DeleteShader(SIMDMode simd, ShaderDispatchMode mode = ShaderDispatchMode::NOT_APPLICABLE);
733733
CodeGenContext* GetContext() { return m_context; }
734734

735+
llvm::Function* getLLVMFunction() const { return m_kernel; }
735736
ShaderStats* m_shaderStats;
736737

738+
// invoked to clear Func ptr when the current module is deleted (so is func within it).
739+
void clearBeforeRetry() {
740+
m_kernel = nullptr;
741+
for (auto S : m_SIMDshaders) {
742+
if (S != nullptr) {
743+
S->entry = nullptr;
744+
}
745+
}
746+
}
747+
737748
protected:
738749
CShader*& GetShaderPtr(SIMDMode simd, ShaderDispatchMode mode);
739750
CShader* CreateNewShader(SIMDMode simd);

IGC/Compiler/CodeGenPublic.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1936,6 +1936,10 @@ namespace IGC
19361936
uint32_t getIntelScratchSpacePrivateMemoryMinimalSizePerThread() const override;
19371937
void failOnSpills();
19381938
bool needsDivergentBarrierHandling() const;
1939+
1940+
void clearBeforeRetry() {
1941+
m_programOutput.clearBeforeRetry();
1942+
}
19391943
private:
19401944
llvm::DenseMap<llvm::Function*, std::string> m_hashes_per_kernel;
19411945
};

0 commit comments

Comments
 (0)