diff options
| author | Yong He <yonghe@outlook.com> | 2024-05-17 23:07:36 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-17 23:07:36 -0700 |
| commit | 62b7219e715bd4c0f984bcd98c9767fb6422c78f (patch) | |
| tree | 114cc03a796c582882eb649948e64172af636780 /source | |
| parent | 40360431dfac9ec122a0300471d42be9d265f452 (diff) | |
Add `-minimum-slang-optimization` to favor compile time. (#4186)
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-api.cpp | 12 | ||||
| -rw-r--r-- | source/slang/slang-check-decl.cpp | 4 | ||||
| -rw-r--r-- | source/slang/slang-compiler-options.h | 5 | ||||
| -rwxr-xr-x | source/slang/slang-compiler.h | 2 | ||||
| -rw-r--r-- | source/slang/slang-emit.cpp | 43 | ||||
| -rw-r--r-- | source/slang/slang-ir-autodiff-fwd.cpp | 2 | ||||
| -rw-r--r-- | source/slang/slang-ir-inline.cpp | 4 | ||||
| -rw-r--r-- | source/slang/slang-ir-inline.h | 3 | ||||
| -rw-r--r-- | source/slang/slang-ir-lower-generics.cpp | 2 | ||||
| -rw-r--r-- | source/slang/slang-ir-simplify-cfg.cpp | 1 | ||||
| -rw-r--r-- | source/slang/slang-ir-specialize-function-call.cpp | 2 | ||||
| -rw-r--r-- | source/slang/slang-ir-specialize-resources.cpp | 6 | ||||
| -rw-r--r-- | source/slang/slang-ir-specialize.cpp | 4 | ||||
| -rw-r--r-- | source/slang/slang-ir-ssa-simplification.cpp | 30 | ||||
| -rw-r--r-- | source/slang/slang-ir-ssa-simplification.h | 17 | ||||
| -rw-r--r-- | source/slang/slang-options.cpp | 1 | ||||
| -rw-r--r-- | source/slang/slang.cpp | 10 |
17 files changed, 108 insertions, 40 deletions
diff --git a/source/slang/slang-api.cpp b/source/slang/slang-api.cpp index ff37d6398..a4ae92bf9 100644 --- a/source/slang/slang-api.cpp +++ b/source/slang/slang-api.cpp @@ -304,6 +304,18 @@ SLANG_API void spSetTargetForceGLSLScalarBufferLayout( request->setTargetForceGLSLScalarBufferLayout(targetIndex, forceScalarLayout); } +SLANG_API void spSetTargetUseMinimumSlangOptimization(slang::ICompileRequest* request, int targetIndex, bool val) +{ + SLANG_ASSERT(request); + request->setTargetUseMinimumSlangOptimization(targetIndex, val); +} + +SLANG_API void spSetIgnoreCapabilityCheck(slang::ICompileRequest* request, bool ignore) +{ + SLANG_ASSERT(request); + request->setIgnoreCapabilityCheck(ignore); +} + SLANG_API void spSetTargetLineDirectiveMode( slang::ICompileRequest* request, int targetIndex, diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp index ab8ffe71d..0fcf642f8 100644 --- a/source/slang/slang-check-decl.cpp +++ b/source/slang/slang-check-decl.cpp @@ -9125,8 +9125,10 @@ namespace Slang break; case DeclCheckState::CapabilityChecked: - if(!shared.getOptionSet().getBoolOption(CompilerOptionName::IgnoreCapabilities)) + if (!shared.getOptionSet().getBoolOption(CompilerOptionName::IgnoreCapabilities)) + { SemanticsDeclCapabilityVisitor(shared).dispatch(decl); + } break; } } diff --git a/source/slang/slang-compiler-options.h b/source/slang/slang-compiler-options.h index 270e789ab..25fbbc407 100644 --- a/source/slang/slang-compiler-options.h +++ b/source/slang/slang-compiler-options.h @@ -361,6 +361,11 @@ namespace Slang return getBoolOption(CompilerOptionName::Obfuscate); } + bool shouldPerformMinimumOptimizations() + { + return getBoolOption(CompilerOptionName::MinimumSlangOptimization); + } + FloatingPointMode getFloatingPointMode() { return getEnumOption<FloatingPointMode>(CompilerOptionName::FloatingPointMode); diff --git a/source/slang/slang-compiler.h b/source/slang/slang-compiler.h index 770449de7..ef8bc45d5 100755 --- a/source/slang/slang-compiler.h +++ b/source/slang/slang-compiler.h @@ -2778,6 +2778,8 @@ namespace Slang virtual SLANG_NO_THROW void SLANG_MCALL setReportDownstreamTime(bool value) SLANG_OVERRIDE; virtual SLANG_NO_THROW void SLANG_MCALL setReportPerfBenchmark(bool value) SLANG_OVERRIDE; virtual SLANG_NO_THROW void SLANG_MCALL setSkipSPIRVValidation(bool value) SLANG_OVERRIDE; + virtual SLANG_NO_THROW void SLANG_MCALL setTargetUseMinimumSlangOptimization(int targetIndex, bool value) SLANG_OVERRIDE; + virtual SLANG_NO_THROW void SLANG_MCALL setIgnoreCapabilityCheck(bool value) SLANG_OVERRIDE; void setTrackLiveness(bool v); diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp index af4add9b7..531084434 100644 --- a/source/slang/slang-emit.cpp +++ b/source/slang/slang-emit.cpp @@ -255,7 +255,8 @@ Result linkAndOptimizeIR( if(!isKhronosTarget(targetRequest)) lowerGLSLShaderStorageBufferObjectsToStructuredBuffers(irModule, sink); - translateGLSLGlobalVar(codeGenContext, irModule); + if (!targetProgram->getOptionSet().shouldPerformMinimumOptimizations()) + translateGLSLGlobalVar(codeGenContext, irModule); // Replace any global constants with their values. // @@ -379,7 +380,11 @@ Result linkAndOptimizeIR( // Lower all the LValue implict casts (used for out/inout/ref scenarios) lowerLValueCast(targetProgram, irModule); - simplifyIR(targetProgram, irModule, IRSimplificationOptions::getDefault(), sink); + IRSimplificationOptions defaultIRSimplificationOptions = IRSimplificationOptions::getDefault(targetProgram); + IRSimplificationOptions fastIRSimplificationOptions = IRSimplificationOptions::getFast(targetProgram); + fastIRSimplificationOptions.minimalOptimization = defaultIRSimplificationOptions.minimalOptimization; + + simplifyIR(targetProgram, irModule, defaultIRSimplificationOptions, sink); if (targetProgram->getOptionSet().getBoolOption(CompilerOptionName::ValidateUniformity)) { @@ -389,12 +394,13 @@ Result linkAndOptimizeIR( } // Fill in default matrix layout into matrix types that left layout unspecified. - specializeMatrixLayout(codeGenContext->getTargetProgram(), irModule); + specializeMatrixLayout(targetProgram, irModule); // It's important that this takes place before defunctionalization as we // want to be able to easily discover the cooperate and fallback funcitons // being passed to saturated_cooperation - fuseCallsToSaturatedCooperation(irModule); + if (!targetProgram->getOptionSet().shouldPerformMinimumOptimizations()) + fuseCallsToSaturatedCooperation(irModule); // Generate any requested derivative wrappers generateDerivativeWrappers(irModule, sink); @@ -451,7 +457,8 @@ Result linkAndOptimizeIR( // which do. // Specialize away these parameters // TODO: We should implement a proper defunctionalization pass - changed |= specializeHigherOrderParameters(codeGenContext, irModule); + if (!targetProgram->getOptionSet().shouldPerformMinimumOptimizations()) + changed |= specializeHigherOrderParameters(codeGenContext, irModule); dumpIRIfEnabled(codeGenContext, irModule, "BEFORE-AUTODIFF"); enableIRValidationAtInsert(); @@ -484,7 +491,9 @@ Result linkAndOptimizeIR( break; } - checkForRecursiveTypes(irModule, sink); + if (!targetProgram->getOptionSet().shouldPerformMinimumOptimizations()) + checkForRecursiveTypes(irModule, sink); + if (sink->getErrorCount() != 0) return SLANG_FAIL; @@ -509,7 +518,7 @@ Result linkAndOptimizeIR( // do unnecessary work to lower them. unpinWitnessTables(irModule); - simplifyIR(targetProgram, irModule, IRSimplificationOptions::getFast(), sink); + simplifyIR(targetProgram, irModule, fastIRSimplificationOptions, sink); if (!ArtifactDescUtil::isCpuLikeTarget(artifactDesc)) { @@ -538,7 +547,7 @@ Result linkAndOptimizeIR( // up downstream passes like type legalization, so we // will run a DCE pass to clean up after the specialization. // - simplifyIR(targetProgram, irModule, IRSimplificationOptions::getDefault(), sink); + simplifyIR(targetProgram, irModule, defaultIRSimplificationOptions, sink); validateIRModuleIfEnabled(codeGenContext, irModule); @@ -643,7 +652,7 @@ Result linkAndOptimizeIR( // to see if we can clean up any temporaries created by legalization. // (e.g., things that used to be aggregated might now be split up, // so that we can work with the individual fields). - simplifyIR(targetProgram, irModule, IRSimplificationOptions::getFast(), sink); + simplifyIR(targetProgram, irModule, fastIRSimplificationOptions, sink); #if 0 dumpIRIfEnabled(codeGenContext, irModule, "AFTER SSA"); @@ -945,7 +954,7 @@ Result linkAndOptimizeIR( { // As a fallback, if the above specialization steps failed to remove resource type parameters, we will // inline the functions in question to make sure we can produce valid GLSL. - performGLSLResourceReturnFunctionInlining(irModule); + performGLSLResourceReturnFunctionInlining(targetProgram, irModule); } #if 0 dumpIRIfEnabled(codeGenContext, irModule, "AFTER DCE"); @@ -1005,8 +1014,9 @@ Result linkAndOptimizeIR( } eliminateMultiLevelBreak(irModule); + if (!fastIRSimplificationOptions.minimalOptimization) { - IRSimplificationOptions simplificationOptions = IRSimplificationOptions::getFast(); + IRSimplificationOptions simplificationOptions = fastIRSimplificationOptions; simplificationOptions.cfgOptions.removeTrivialSingleIterationLoops = true; simplifyIR(targetProgram, irModule, simplificationOptions, sink); } @@ -1085,11 +1095,15 @@ Result linkAndOptimizeIR( } } - replaceLocationIntrinsicsWithRaytracingObject(targetProgram, irModule, sink); + if (isKhronosTarget(targetRequest) && emitSpirvDirectly) + { + replaceLocationIntrinsicsWithRaytracingObject(targetProgram, irModule, sink); + } + validateIRModuleIfEnabled(codeGenContext, irModule); // Run a final round of simplifications to clean up unused things after phi-elimination. - simplifyNonSSAIR(targetProgram, irModule, IRSimplificationOptions::getFast()); + simplifyNonSSAIR(targetProgram, irModule, fastIRSimplificationOptions); // We include one final step to (optionally) dump the IR and validate // it after all of the optimization passes are complete. This should @@ -1119,7 +1133,8 @@ Result linkAndOptimizeIR( outLinkedIR.metadata = metadata; - checkUnsupportedInst(codeGenContext->getTargetReq(), irModule, sink); + if (!targetProgram->getOptionSet().shouldPerformMinimumOptimizations()) + checkUnsupportedInst(codeGenContext->getTargetReq(), irModule, sink); return sink->getErrorCount() == 0 ? SLANG_OK : SLANG_FAIL; } diff --git a/source/slang/slang-ir-autodiff-fwd.cpp b/source/slang/slang-ir-autodiff-fwd.cpp index 91a0586b7..69e2832d3 100644 --- a/source/slang/slang-ir-autodiff-fwd.cpp +++ b/source/slang/slang-ir-autodiff-fwd.cpp @@ -1655,7 +1655,7 @@ SlangResult ForwardDiffTranscriber::prepareFuncForForwardDiff(IRFunc* func) if (SLANG_SUCCEEDED(result)) { disableIRValidationAtInsert(); - simplifyFunc(autoDiffSharedContext->targetProgram, func, IRSimplificationOptions::getDefault()); + simplifyFunc(autoDiffSharedContext->targetProgram, func, IRSimplificationOptions::getDefault(autoDiffSharedContext->targetProgram)); enableIRValidationAtInsert(); } return result; diff --git a/source/slang/slang-ir-inline.cpp b/source/slang/slang-ir-inline.cpp index 1e8c1462f..a2ccc1ed7 100644 --- a/source/slang/slang-ir-inline.cpp +++ b/source/slang/slang-ir-inline.cpp @@ -942,7 +942,7 @@ struct GLSLResourceReturnFunctionInliningPass : InliningPassBase } }; -void performGLSLResourceReturnFunctionInlining(IRModule* module) +void performGLSLResourceReturnFunctionInlining(TargetProgram* targetProgram, IRModule* module) { GLSLResourceReturnFunctionInliningPass pass(module); bool changed = true; @@ -950,7 +950,7 @@ void performGLSLResourceReturnFunctionInlining(IRModule* module) while (changed) { changed = pass.considerAllCallSites(); - simplifyIR(nullptr, module, IRSimplificationOptions::getFast()); + simplifyIR(nullptr, module, IRSimplificationOptions::getFast(targetProgram)); } } diff --git a/source/slang/slang-ir-inline.h b/source/slang/slang-ir-inline.h index c5b457a65..e12f5f0d5 100644 --- a/source/slang/slang-ir-inline.h +++ b/source/slang/slang-ir-inline.h @@ -9,6 +9,7 @@ namespace Slang struct IRCall; struct IRGlobalValueWithCode; class DiagnosticSink; + class TargetProgram; /// Any call to a function that takes or returns a string/RefType parameter is inlined Result performTypeInlining(IRModule* module, DiagnosticSink* sink); @@ -29,7 +30,7 @@ namespace Slang bool performPreAutoDiffForceInlining(IRModule* module); /// Inline calls to functions that returns a resource/sampler via either return value or output parameter. - void performGLSLResourceReturnFunctionInlining(IRModule* module); + void performGLSLResourceReturnFunctionInlining(TargetProgram* targetProgram, IRModule* module); /// Inline simple intrinsic functions whose definition is a single asm block. void performIntrinsicFunctionInlining(IRModule* module); diff --git a/source/slang/slang-ir-lower-generics.cpp b/source/slang/slang-ir-lower-generics.cpp index fd8c9257b..dd85487f5 100644 --- a/source/slang/slang-ir-lower-generics.cpp +++ b/source/slang/slang-ir-lower-generics.cpp @@ -255,7 +255,7 @@ namespace Slang // real RTTI objects and witness tables. specializeRTTIObjects(&sharedContext, sink); - simplifyIR(sharedContext.targetProgram, module, IRSimplificationOptions::getFast()); + simplifyIR(sharedContext.targetProgram, module, IRSimplificationOptions::getFast(sharedContext.targetProgram)); lowerTuples(module, sink); if (sink->getErrorCount() != 0) diff --git a/source/slang/slang-ir-simplify-cfg.cpp b/source/slang/slang-ir-simplify-cfg.cpp index ad10a8c48..f129c7d27 100644 --- a/source/slang/slang-ir-simplify-cfg.cpp +++ b/source/slang/slang-ir-simplify-cfg.cpp @@ -900,6 +900,7 @@ static bool processFunc(IRGlobalValueWithCode* func, CFGSimplificationOptions op branch->removeAndDeallocate(); assert(!successor->hasUses()); successor->removeAndDeallocate(); + break; } for (auto successor : block->getSuccessors()) diff --git a/source/slang/slang-ir-specialize-function-call.cpp b/source/slang/slang-ir-specialize-function-call.cpp index 7cf1516b8..c4928a230 100644 --- a/source/slang/slang-ir-specialize-function-call.cpp +++ b/source/slang/slang-ir-specialize-function-call.cpp @@ -891,7 +891,7 @@ struct FunctionParameterSpecializationContext // addCallsToWorkListRec(newFunc); - simplifyFunc(codeGenContext->getTargetProgram(), newFunc, IRSimplificationOptions::getFast()); + simplifyFunc(codeGenContext->getTargetProgram(), newFunc, IRSimplificationOptions::getFast(codeGenContext->getTargetProgram())); return newFunc; } diff --git a/source/slang/slang-ir-specialize-resources.cpp b/source/slang/slang-ir-specialize-resources.cpp index e1c1788cb..d5987db48 100644 --- a/source/slang/slang-ir-specialize-resources.cpp +++ b/source/slang/slang-ir-specialize-resources.cpp @@ -1189,7 +1189,8 @@ bool specializeResourceUsage( // and turned into SSA temporaries. Such optimization may enable // the following passes to "see" and specialize more cases. // - simplifyIR(codeGenContext->getTargetProgram(), irModule, IRSimplificationOptions::getFast()); + simplifyIR(codeGenContext->getTargetProgram(), irModule, + IRSimplificationOptions::getFast(codeGenContext->getTargetProgram())); result |= changed; } if (unspecializableFuncs.getCount() == 0) @@ -1209,7 +1210,8 @@ bool specializeResourceUsage( inlineCall(call); }); } - simplifyIR(codeGenContext->getTargetProgram(), irModule, IRSimplificationOptions::getFast()); + simplifyIR(codeGenContext->getTargetProgram(), irModule, + IRSimplificationOptions::getFast(codeGenContext->getTargetProgram())); } return result; } diff --git a/source/slang/slang-ir-specialize.cpp b/source/slang/slang-ir-specialize.cpp index 72e39590b..6137a7158 100644 --- a/source/slang/slang-ir-specialize.cpp +++ b/source/slang/slang-ir-specialize.cpp @@ -1546,7 +1546,7 @@ struct SpecializationContext // addToWorkList(newFunc); - simplifyFunc(targetProgram, newFunc, IRSimplificationOptions::getFast()); + simplifyFunc(targetProgram, newFunc, IRSimplificationOptions::getFast(targetProgram)); return newFunc; } @@ -2407,7 +2407,7 @@ IRInst* specializeGenericImpl( { if (auto func = as<IRFunc>(specializedVal)) { - simplifyFunc(context->targetProgram, func, IRSimplificationOptions::getFast()); + simplifyFunc(context->targetProgram, func, IRSimplificationOptions::getFast(context->targetProgram)); } } diff --git a/source/slang/slang-ir-ssa-simplification.cpp b/source/slang/slang-ir-ssa-simplification.cpp index 6a0fb620e..a0224cea5 100644 --- a/source/slang/slang-ir-ssa-simplification.cpp +++ b/source/slang/slang-ir-ssa-simplification.cpp @@ -15,6 +15,27 @@ namespace Slang { + IRSimplificationOptions IRSimplificationOptions::getDefault(TargetProgram* targetProgram) + { + IRSimplificationOptions result; + result.minimalOptimization = targetProgram->getOptionSet().shouldPerformMinimumOptimizations(); + if (result.minimalOptimization) + result.cfgOptions = CFGSimplificationOptions::getFast(); + else + result.cfgOptions = CFGSimplificationOptions::getDefault(); + result.peepholeOptions = PeepholeOptimizationOptions(); + return result; + } + + IRSimplificationOptions IRSimplificationOptions::getFast(TargetProgram* targetProgram) + { + IRSimplificationOptions result; + result.minimalOptimization = targetProgram->getOptionSet().shouldPerformMinimumOptimizations(); + result.cfgOptions = CFGSimplificationOptions::getFast(); + result.peepholeOptions = PeepholeOptimizationOptions(); + return result; + } + // Run a combination of SSA, SCCP, SimplifyCFG, and DeadCodeElimination pass // until no more changes are possible. void simplifyIR(TargetProgram* target, IRModule* module, IRSimplificationOptions options, DiagnosticSink* sink) @@ -50,7 +71,8 @@ namespace Slang funcChanged = false; funcChanged |= applySparseConditionalConstantPropagation(func, sink); funcChanged |= peepholeOptimize(target, func); - funcChanged |= removeRedundancyInFunc(func); + if (!options.minimalOptimization) + funcChanged |= removeRedundancyInFunc(func); funcChanged |= simplifyCFG(func, options.cfgOptions); eliminateDeadCode(func); funcChanged |= constructSSA(func); @@ -78,7 +100,8 @@ namespace Slang changed = false; changed |= peepholeOptimize(target, module, options.peepholeOptions); - changed |= removeRedundancy(module); + if (!options.minimalOptimization) + changed |= removeRedundancy(module); changed |= simplifyCFG(module, options.cfgOptions); // Note: we disregard the `changed` state from dead code elimination pass since @@ -103,7 +126,8 @@ namespace Slang changed = false; changed |= applySparseConditionalConstantPropagation(func, sink); changed |= peepholeOptimize(target, func); - changed |= removeRedundancyInFunc(func); + if (!options.minimalOptimization) + changed |= removeRedundancyInFunc(func); changed |= simplifyCFG(func, options.cfgOptions); // Note: we disregard the `changed` state from dead code elimination pass since diff --git a/source/slang/slang-ir-ssa-simplification.h b/source/slang/slang-ir-ssa-simplification.h index 4ae8e8e6e..166f5a5f3 100644 --- a/source/slang/slang-ir-ssa-simplification.h +++ b/source/slang/slang-ir-ssa-simplification.h @@ -15,19 +15,12 @@ namespace Slang { CFGSimplificationOptions cfgOptions; PeepholeOptimizationOptions peepholeOptions; + bool minimalOptimization = false; + + static IRSimplificationOptions getDefault(TargetProgram* targetProgram); + + static IRSimplificationOptions getFast(TargetProgram* targetProgram); - static IRSimplificationOptions getDefault() - { - IRSimplificationOptions result; - return result; - } - static IRSimplificationOptions getFast() - { - IRSimplificationOptions result; - result.cfgOptions.removeSideEffectFreeLoops = false; - result.cfgOptions.removeTrivialSingleIterationLoops = false; - return result; - } }; // Run a combination of SSA, SCCP, SimplifyCFG, and DeadCodeElimination pass diff --git a/source/slang/slang-options.cpp b/source/slang/slang-options.cpp index 1f27c5efa..d140df4c3 100644 --- a/source/slang/slang-options.cpp +++ b/source/slang/slang-options.cpp @@ -290,6 +290,7 @@ void initCommandOptions(CommandOptions& options) { OptionKind::MatrixLayoutColumn, "-matrix-layout-column-major", nullptr, "Set the default matrix layout to column-major."}, { OptionKind::MatrixLayoutRow,"-matrix-layout-row-major", nullptr, "Set the default matrix layout to row-major."}, { OptionKind::IgnoreCapabilities,"-ignore-capabilities", nullptr, "Do not warn or error if capabilities are violated"}, + { OptionKind::MinimumSlangOptimization, "-minimum-slang-optimization", nullptr, "Perform minimum code optimization in Slang to favor compilation time."}, { OptionKind::ModuleName, "-module-name", "-module-name <name>", "Set the module name to use when compiling multiple .slang source files into a single module."}, { OptionKind::Output, "-o", "-o <path>", diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp index c6af8b34d..b60630f02 100644 --- a/source/slang/slang.cpp +++ b/source/slang/slang.cpp @@ -5690,6 +5690,16 @@ void EndToEndCompileRequest::setSkipSPIRVValidation(bool value) getOptionSet().set(CompilerOptionName::SkipSPIRVValidation, value); } +void EndToEndCompileRequest::setTargetUseMinimumSlangOptimization(int targetIndex, bool value) +{ + getTargetOptionSet(targetIndex).set(CompilerOptionName::MinimumSlangOptimization, value); +} + +void EndToEndCompileRequest::setIgnoreCapabilityCheck(bool value) +{ + getOptionSet().set(CompilerOptionName::IgnoreCapabilities, value); +} + void EndToEndCompileRequest::setDiagnosticCallback(SlangDiagnosticCallback callback, void const* userData) { ComPtr<ISlangWriter> writer(new CallbackWriter(callback, userData, WriterFlag::IsConsole)); |
