diff --git a/sycl/plugins/level_zero/pi_level_zero.cpp b/sycl/plugins/level_zero/pi_level_zero.cpp index c25c8624ea00d..08eeb056b51bb 100644 --- a/sycl/plugins/level_zero/pi_level_zero.cpp +++ b/sycl/plugins/level_zero/pi_level_zero.cpp @@ -3852,10 +3852,6 @@ pi_result piProgramBuild(pi_program Program, pi_uint32 NumDevices, // RT calls piProgramRelease(). Program->State = _pi_program::Invalid; Result = mapError(ZeResult); - if (Program->ZeBuildLog) { - ZE_CALL_NOCHECK(zeModuleBuildLogDestroy, (Program->ZeBuildLog)); - Program->ZeBuildLog = nullptr; - } if (ZeModule) { ZE_CALL_NOCHECK(zeModuleDestroy, (ZeModule)); ZeModule = nullptr; @@ -3923,6 +3919,18 @@ pi_result piProgramGetBuildInfo(pi_program Program, pi_device Device, if (ParamValueSizeRet) { *ParamValueSizeRet = LogSize; } + if (ParamValue) { + // When the program build fails in piProgramBuild(), we delayed cleaning + // up the build log because RT later calls this routine to get the + // failed build log. + // To avoid memory leaks, we should clean up the failed build log here + // because RT does not create sycl::program when piProgramBuild() fails, + // thus it won't call piProgramRelease() to clean up the build log. + if (Program->State == _pi_program::Invalid) { + ZE_CALL_NOCHECK(zeModuleBuildLogDestroy, (Program->ZeBuildLog)); + Program->ZeBuildLog = nullptr; + } + } return PI_SUCCESS; }