diff --git a/level_zero/core/source/module/module_imp.cpp b/level_zero/core/source/module/module_imp.cpp index 5ac883424a..5d94ded48d 100644 --- a/level_zero/core/source/module/module_imp.cpp +++ b/level_zero/core/source/module/module_imp.cpp @@ -35,6 +35,7 @@ namespace L0 { namespace BuildOptions { NEO::ConstStringRef optDisable = "-ze-opt-disable"; +NEO::ConstStringRef optLevel = "-ze-opt-level"; NEO::ConstStringRef greaterThan4GbRequired = "-ze-opt-greater-than-4GB-buffer-required"; NEO::ConstStringRef hasBufferOffsetArg = "-ze-intel-has-buffer-offset-arg"; NEO::ConstStringRef debugKernelEnable = "-ze-kernel-debug-enable"; @@ -422,6 +423,7 @@ void ModuleImp::createBuildOptions(const char *pBuildFlags, std::string &apiOpti apiOptions = pBuildFlags; moveBuildOption(apiOptions, apiOptions, NEO::CompilerOptions::optDisable, BuildOptions::optDisable); + moveBuildOption(apiOptions, apiOptions, NEO::CompilerOptions::optLevel, BuildOptions::optLevel); moveBuildOption(internalBuildOptions, apiOptions, NEO::CompilerOptions::greaterThan4gbBuffersRequired, BuildOptions::greaterThan4GbRequired); moveBuildOption(internalBuildOptions, apiOptions, NEO::CompilerOptions::allowZebin, NEO::CompilerOptions::allowZebin); @@ -698,13 +700,25 @@ ze_result_t ModuleImp::performDynamicLink(uint32_t numModules, } bool moveBuildOption(std::string &dstOptionsSet, std::string &srcOptionSet, NEO::ConstStringRef dstOptionName, NEO::ConstStringRef srcOptionName) { + const char optDelim = ' '; + const char valDelim = '='; + auto optInSrcPos = srcOptionSet.find(srcOptionName.begin()); if (std::string::npos == optInSrcPos) { return false; } - srcOptionSet.erase(optInSrcPos, srcOptionName.length()); - NEO::CompilerOptions::concatenateAppend(dstOptionsSet, dstOptionName); + std::string dstOptionStr(dstOptionName); + auto optInSrcEndPos = srcOptionSet.find(optDelim, optInSrcPos); + if (srcOptionName == BuildOptions::optLevel) { + auto valInSrcPos = srcOptionSet.find(valDelim, optInSrcPos); + if (std::string::npos == valInSrcPos) { + return false; + } + dstOptionStr += srcOptionSet.substr(valInSrcPos + 1, optInSrcEndPos); + } + srcOptionSet.erase(optInSrcPos, (optInSrcEndPos - optInSrcPos)); + NEO::CompilerOptions::concatenateAppend(dstOptionsSet, dstOptionStr); return true; } diff --git a/level_zero/core/source/module/module_imp.h b/level_zero/core/source/module/module_imp.h index 9408ac24e6..0663a83706 100644 --- a/level_zero/core/source/module/module_imp.h +++ b/level_zero/core/source/module/module_imp.h @@ -24,6 +24,7 @@ namespace L0 { namespace BuildOptions { extern NEO::ConstStringRef optDisable; +extern NEO::ConstStringRef optLevel; extern NEO::ConstStringRef greaterThan4GbRequired; extern NEO::ConstStringRef hasBufferOffsetArg; extern NEO::ConstStringRef debugKernelEnable; diff --git a/level_zero/core/test/unit_tests/sources/module/test_module.cpp b/level_zero/core/test/unit_tests/sources/module/test_module.cpp index af86a90251..9ae2e3ea62 100644 --- a/level_zero/core/test/unit_tests/sources/module/test_module.cpp +++ b/level_zero/core/test/unit_tests/sources/module/test_module.cpp @@ -1230,6 +1230,27 @@ TEST(BuildOptions, givenSrcOptionNameInSrcNamesWhenMovingBuildOptionsThenOptionI EXPECT_EQ(std::string::npos, srcNames.find(NEO::CompilerOptions::optDisable.str())); } +TEST(BuildOptions, givenSrcOptLevelInSrcNamesWhenMovingBuildOptionsThenOptionIsRemovedFromSrcNamesAndTranslatedOptionsStoredInDstNames) { + std::string srcNames = NEO::CompilerOptions::concatenate(NEO::CompilerOptions::fastRelaxedMath, BuildOptions::optLevel); + srcNames += "=2"; + std::string dstNames; + + auto result = moveBuildOption(dstNames, srcNames, NEO::CompilerOptions::optLevel, BuildOptions::optLevel); + EXPECT_TRUE(result); + + EXPECT_EQ(NEO::CompilerOptions::optLevel.str() + std::string("2"), dstNames); + EXPECT_EQ(std::string::npos, srcNames.find(BuildOptions::optLevel.str())); + EXPECT_EQ(std::string::npos, srcNames.find(std::string("=2"))); +} + +TEST(BuildOptions, givenSrcOptLevelWithoutLevelIntegerInSrcNamesWhenMovingBuildOptionsThenFalseIsReturned) { + std::string srcNames = NEO::CompilerOptions::concatenate(NEO::CompilerOptions::fastRelaxedMath, BuildOptions::optLevel); + std::string dstNames; + + auto result = moveBuildOption(dstNames, srcNames, NEO::CompilerOptions::optLevel, BuildOptions::optLevel); + EXPECT_FALSE(result); +} + TEST_F(ModuleTest, givenInternalOptionsWhenBindlessEnabledThenBindlesOptionsPassed) { DebugManagerStateRestore restorer; DebugManager.flags.UseBindlessMode.set(1); diff --git a/shared/source/compiler_interface/compiler_options/compiler_options_base.h b/shared/source/compiler_interface/compiler_options/compiler_options_base.h index d4a0146253..a92bd9a99d 100644 --- a/shared/source/compiler_interface/compiler_options/compiler_options_base.h +++ b/shared/source/compiler_interface/compiler_options/compiler_options_base.h @@ -32,6 +32,7 @@ static constexpr ConstStringRef forceEmuInt32DivRem = "-cl-intel-force-emu-int32 static constexpr ConstStringRef forceEmuInt32DivRemSP = "-cl-intel-force-emu-sp-int32divrem"; static constexpr ConstStringRef allowZebin = "-allow-zebin"; static constexpr ConstStringRef enableImageSupport = "-D__IMAGE_SUPPORT__=1"; +static constexpr ConstStringRef optLevel = "-ze-opt-level=O"; constexpr size_t nullterminateSize = 1U; constexpr size_t spaceSeparatorSize = 1U;