Skip to content

Commit 62b7219

Browse files
authored
Add -minimum-slang-optimization to favor compile time. (#4186)
1 parent 4036043 commit 62b7219

18 files changed

+124
-40
lines changed

slang.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -862,6 +862,7 @@ extern "C"
862862
SourceEmbedName,
863863
SourceEmbedLanguage,
864864
DisableShortCircuit, // bool
865+
MinimumSlangOptimization, // bool
865866

866867
// Target
867868

@@ -1709,6 +1710,17 @@ extern "C"
17091710
int targetIndex,
17101711
bool forceScalarLayout);
17111712

1713+
/*! @see slang::ICompileRequest::setTargetUseMinimumSlangOptimization */
1714+
SLANG_API void spSetTargetUseMinimumSlangOptimization(
1715+
slang::ICompileRequest* request,
1716+
int targetIndex,
1717+
bool val);
1718+
1719+
/*! @see slang::ICompileRequest::setIngoreCapabilityCheck */
1720+
SLANG_API void spSetIgnoreCapabilityCheck(
1721+
slang::ICompileRequest* request,
1722+
bool val);
1723+
17121724
/*! @see slang::ICompileRequest::setCodeGenTarget */
17131725
SLANG_API void spSetCodeGenTarget(
17141726
SlangCompileRequest* request,
@@ -4403,6 +4415,10 @@ namespace slang
44034415

44044416
virtual SLANG_NO_THROW void SLANG_MCALL setSkipSPIRVValidation(bool value) = 0;
44054417

4418+
virtual SLANG_NO_THROW void SLANG_MCALL setTargetUseMinimumSlangOptimization(int targetIndex, bool value) = 0;
4419+
4420+
virtual SLANG_NO_THROW void SLANG_MCALL setIgnoreCapabilityCheck(bool value) = 0;
4421+
44064422
};
44074423

44084424
#define SLANG_UUID_ICompileRequest ICompileRequest::getTypeGuid()

source/slang/slang-api.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,18 @@ SLANG_API void spSetTargetForceGLSLScalarBufferLayout(
304304
request->setTargetForceGLSLScalarBufferLayout(targetIndex, forceScalarLayout);
305305
}
306306

307+
SLANG_API void spSetTargetUseMinimumSlangOptimization(slang::ICompileRequest* request, int targetIndex, bool val)
308+
{
309+
SLANG_ASSERT(request);
310+
request->setTargetUseMinimumSlangOptimization(targetIndex, val);
311+
}
312+
313+
SLANG_API void spSetIgnoreCapabilityCheck(slang::ICompileRequest* request, bool ignore)
314+
{
315+
SLANG_ASSERT(request);
316+
request->setIgnoreCapabilityCheck(ignore);
317+
}
318+
307319
SLANG_API void spSetTargetLineDirectiveMode(
308320
slang::ICompileRequest* request,
309321
int targetIndex,

source/slang/slang-check-decl.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9125,8 +9125,10 @@ namespace Slang
91259125
break;
91269126

91279127
case DeclCheckState::CapabilityChecked:
9128-
if(!shared.getOptionSet().getBoolOption(CompilerOptionName::IgnoreCapabilities))
9128+
if (!shared.getOptionSet().getBoolOption(CompilerOptionName::IgnoreCapabilities))
9129+
{
91299130
SemanticsDeclCapabilityVisitor(shared).dispatch(decl);
9131+
}
91309132
break;
91319133
}
91329134
}

source/slang/slang-compiler-options.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,11 @@ namespace Slang
361361
return getBoolOption(CompilerOptionName::Obfuscate);
362362
}
363363

364+
bool shouldPerformMinimumOptimizations()
365+
{
366+
return getBoolOption(CompilerOptionName::MinimumSlangOptimization);
367+
}
368+
364369
FloatingPointMode getFloatingPointMode()
365370
{
366371
return getEnumOption<FloatingPointMode>(CompilerOptionName::FloatingPointMode);

source/slang/slang-compiler.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2778,6 +2778,8 @@ namespace Slang
27782778
virtual SLANG_NO_THROW void SLANG_MCALL setReportDownstreamTime(bool value) SLANG_OVERRIDE;
27792779
virtual SLANG_NO_THROW void SLANG_MCALL setReportPerfBenchmark(bool value) SLANG_OVERRIDE;
27802780
virtual SLANG_NO_THROW void SLANG_MCALL setSkipSPIRVValidation(bool value) SLANG_OVERRIDE;
2781+
virtual SLANG_NO_THROW void SLANG_MCALL setTargetUseMinimumSlangOptimization(int targetIndex, bool value) SLANG_OVERRIDE;
2782+
virtual SLANG_NO_THROW void SLANG_MCALL setIgnoreCapabilityCheck(bool value) SLANG_OVERRIDE;
27812783

27822784
void setTrackLiveness(bool v);
27832785

source/slang/slang-emit.cpp

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,8 @@ Result linkAndOptimizeIR(
255255
if(!isKhronosTarget(targetRequest))
256256
lowerGLSLShaderStorageBufferObjectsToStructuredBuffers(irModule, sink);
257257

258-
translateGLSLGlobalVar(codeGenContext, irModule);
258+
if (!targetProgram->getOptionSet().shouldPerformMinimumOptimizations())
259+
translateGLSLGlobalVar(codeGenContext, irModule);
259260

260261
// Replace any global constants with their values.
261262
//
@@ -379,7 +380,11 @@ Result linkAndOptimizeIR(
379380
// Lower all the LValue implict casts (used for out/inout/ref scenarios)
380381
lowerLValueCast(targetProgram, irModule);
381382

382-
simplifyIR(targetProgram, irModule, IRSimplificationOptions::getDefault(), sink);
383+
IRSimplificationOptions defaultIRSimplificationOptions = IRSimplificationOptions::getDefault(targetProgram);
384+
IRSimplificationOptions fastIRSimplificationOptions = IRSimplificationOptions::getFast(targetProgram);
385+
fastIRSimplificationOptions.minimalOptimization = defaultIRSimplificationOptions.minimalOptimization;
386+
387+
simplifyIR(targetProgram, irModule, defaultIRSimplificationOptions, sink);
383388

384389
if (targetProgram->getOptionSet().getBoolOption(CompilerOptionName::ValidateUniformity))
385390
{
@@ -389,12 +394,13 @@ Result linkAndOptimizeIR(
389394
}
390395

391396
// Fill in default matrix layout into matrix types that left layout unspecified.
392-
specializeMatrixLayout(codeGenContext->getTargetProgram(), irModule);
397+
specializeMatrixLayout(targetProgram, irModule);
393398

394399
// It's important that this takes place before defunctionalization as we
395400
// want to be able to easily discover the cooperate and fallback funcitons
396401
// being passed to saturated_cooperation
397-
fuseCallsToSaturatedCooperation(irModule);
402+
if (!targetProgram->getOptionSet().shouldPerformMinimumOptimizations())
403+
fuseCallsToSaturatedCooperation(irModule);
398404

399405
// Generate any requested derivative wrappers
400406
generateDerivativeWrappers(irModule, sink);
@@ -451,7 +457,8 @@ Result linkAndOptimizeIR(
451457
// which do.
452458
// Specialize away these parameters
453459
// TODO: We should implement a proper defunctionalization pass
454-
changed |= specializeHigherOrderParameters(codeGenContext, irModule);
460+
if (!targetProgram->getOptionSet().shouldPerformMinimumOptimizations())
461+
changed |= specializeHigherOrderParameters(codeGenContext, irModule);
455462

456463
dumpIRIfEnabled(codeGenContext, irModule, "BEFORE-AUTODIFF");
457464
enableIRValidationAtInsert();
@@ -484,7 +491,9 @@ Result linkAndOptimizeIR(
484491
break;
485492
}
486493

487-
checkForRecursiveTypes(irModule, sink);
494+
if (!targetProgram->getOptionSet().shouldPerformMinimumOptimizations())
495+
checkForRecursiveTypes(irModule, sink);
496+
488497
if (sink->getErrorCount() != 0)
489498
return SLANG_FAIL;
490499

@@ -509,7 +518,7 @@ Result linkAndOptimizeIR(
509518
// do unnecessary work to lower them.
510519
unpinWitnessTables(irModule);
511520

512-
simplifyIR(targetProgram, irModule, IRSimplificationOptions::getFast(), sink);
521+
simplifyIR(targetProgram, irModule, fastIRSimplificationOptions, sink);
513522

514523
if (!ArtifactDescUtil::isCpuLikeTarget(artifactDesc))
515524
{
@@ -538,7 +547,7 @@ Result linkAndOptimizeIR(
538547
// up downstream passes like type legalization, so we
539548
// will run a DCE pass to clean up after the specialization.
540549
//
541-
simplifyIR(targetProgram, irModule, IRSimplificationOptions::getDefault(), sink);
550+
simplifyIR(targetProgram, irModule, defaultIRSimplificationOptions, sink);
542551

543552
validateIRModuleIfEnabled(codeGenContext, irModule);
544553

@@ -643,7 +652,7 @@ Result linkAndOptimizeIR(
643652
// to see if we can clean up any temporaries created by legalization.
644653
// (e.g., things that used to be aggregated might now be split up,
645654
// so that we can work with the individual fields).
646-
simplifyIR(targetProgram, irModule, IRSimplificationOptions::getFast(), sink);
655+
simplifyIR(targetProgram, irModule, fastIRSimplificationOptions, sink);
647656

648657
#if 0
649658
dumpIRIfEnabled(codeGenContext, irModule, "AFTER SSA");
@@ -945,7 +954,7 @@ Result linkAndOptimizeIR(
945954
{
946955
// As a fallback, if the above specialization steps failed to remove resource type parameters, we will
947956
// inline the functions in question to make sure we can produce valid GLSL.
948-
performGLSLResourceReturnFunctionInlining(irModule);
957+
performGLSLResourceReturnFunctionInlining(targetProgram, irModule);
949958
}
950959
#if 0
951960
dumpIRIfEnabled(codeGenContext, irModule, "AFTER DCE");
@@ -1005,8 +1014,9 @@ Result linkAndOptimizeIR(
10051014
}
10061015
eliminateMultiLevelBreak(irModule);
10071016

1017+
if (!fastIRSimplificationOptions.minimalOptimization)
10081018
{
1009-
IRSimplificationOptions simplificationOptions = IRSimplificationOptions::getFast();
1019+
IRSimplificationOptions simplificationOptions = fastIRSimplificationOptions;
10101020
simplificationOptions.cfgOptions.removeTrivialSingleIterationLoops = true;
10111021
simplifyIR(targetProgram, irModule, simplificationOptions, sink);
10121022
}
@@ -1085,11 +1095,15 @@ Result linkAndOptimizeIR(
10851095
}
10861096
}
10871097

1088-
replaceLocationIntrinsicsWithRaytracingObject(targetProgram, irModule, sink);
1098+
if (isKhronosTarget(targetRequest) && emitSpirvDirectly)
1099+
{
1100+
replaceLocationIntrinsicsWithRaytracingObject(targetProgram, irModule, sink);
1101+
}
1102+
10891103
validateIRModuleIfEnabled(codeGenContext, irModule);
10901104

10911105
// Run a final round of simplifications to clean up unused things after phi-elimination.
1092-
simplifyNonSSAIR(targetProgram, irModule, IRSimplificationOptions::getFast());
1106+
simplifyNonSSAIR(targetProgram, irModule, fastIRSimplificationOptions);
10931107

10941108
// We include one final step to (optionally) dump the IR and validate
10951109
// it after all of the optimization passes are complete. This should
@@ -1119,7 +1133,8 @@ Result linkAndOptimizeIR(
11191133

11201134
outLinkedIR.metadata = metadata;
11211135

1122-
checkUnsupportedInst(codeGenContext->getTargetReq(), irModule, sink);
1136+
if (!targetProgram->getOptionSet().shouldPerformMinimumOptimizations())
1137+
checkUnsupportedInst(codeGenContext->getTargetReq(), irModule, sink);
11231138

11241139
return sink->getErrorCount() == 0 ? SLANG_OK : SLANG_FAIL;
11251140
}

source/slang/slang-ir-autodiff-fwd.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1655,7 +1655,7 @@ SlangResult ForwardDiffTranscriber::prepareFuncForForwardDiff(IRFunc* func)
16551655
if (SLANG_SUCCEEDED(result))
16561656
{
16571657
disableIRValidationAtInsert();
1658-
simplifyFunc(autoDiffSharedContext->targetProgram, func, IRSimplificationOptions::getDefault());
1658+
simplifyFunc(autoDiffSharedContext->targetProgram, func, IRSimplificationOptions::getDefault(autoDiffSharedContext->targetProgram));
16591659
enableIRValidationAtInsert();
16601660
}
16611661
return result;

source/slang/slang-ir-inline.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -942,15 +942,15 @@ struct GLSLResourceReturnFunctionInliningPass : InliningPassBase
942942
}
943943
};
944944

945-
void performGLSLResourceReturnFunctionInlining(IRModule* module)
945+
void performGLSLResourceReturnFunctionInlining(TargetProgram* targetProgram, IRModule* module)
946946
{
947947
GLSLResourceReturnFunctionInliningPass pass(module);
948948
bool changed = true;
949949

950950
while (changed)
951951
{
952952
changed = pass.considerAllCallSites();
953-
simplifyIR(nullptr, module, IRSimplificationOptions::getFast());
953+
simplifyIR(nullptr, module, IRSimplificationOptions::getFast(targetProgram));
954954
}
955955
}
956956

source/slang/slang-ir-inline.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace Slang
99
struct IRCall;
1010
struct IRGlobalValueWithCode;
1111
class DiagnosticSink;
12+
class TargetProgram;
1213

1314
/// Any call to a function that takes or returns a string/RefType parameter is inlined
1415
Result performTypeInlining(IRModule* module, DiagnosticSink* sink);
@@ -29,7 +30,7 @@ namespace Slang
2930
bool performPreAutoDiffForceInlining(IRModule* module);
3031

3132
/// Inline calls to functions that returns a resource/sampler via either return value or output parameter.
32-
void performGLSLResourceReturnFunctionInlining(IRModule* module);
33+
void performGLSLResourceReturnFunctionInlining(TargetProgram* targetProgram, IRModule* module);
3334

3435
/// Inline simple intrinsic functions whose definition is a single asm block.
3536
void performIntrinsicFunctionInlining(IRModule* module);

source/slang/slang-ir-lower-generics.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ namespace Slang
255255
// real RTTI objects and witness tables.
256256
specializeRTTIObjects(&sharedContext, sink);
257257

258-
simplifyIR(sharedContext.targetProgram, module, IRSimplificationOptions::getFast());
258+
simplifyIR(sharedContext.targetProgram, module, IRSimplificationOptions::getFast(sharedContext.targetProgram));
259259

260260
lowerTuples(module, sink);
261261
if (sink->getErrorCount() != 0)

0 commit comments

Comments
 (0)