Skip to content

Commit b9f9c88

Browse files
committed
Add -minimum-slang-optimization to favor compile time.
1 parent 9f786fd commit b9f9c88

16 files changed

+88
-40
lines changed

slang.h

+1
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

source/slang/slang-check-decl.cpp

+3-1
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

+5
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-emit.cpp

+29-14
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

+1-1
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

+2-2
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

+2-1
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

+1-1
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)

source/slang/slang-ir-simplify-cfg.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,7 @@ static bool processFunc(IRGlobalValueWithCode* func, CFGSimplificationOptions op
900900
branch->removeAndDeallocate();
901901
assert(!successor->hasUses());
902902
successor->removeAndDeallocate();
903+
903904
break;
904905
}
905906
for (auto successor : block->getSuccessors())

source/slang/slang-ir-specialize-function-call.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -891,7 +891,7 @@ struct FunctionParameterSpecializationContext
891891
//
892892
addCallsToWorkListRec(newFunc);
893893

894-
simplifyFunc(codeGenContext->getTargetProgram(), newFunc, IRSimplificationOptions::getFast());
894+
simplifyFunc(codeGenContext->getTargetProgram(), newFunc, IRSimplificationOptions::getFast(codeGenContext->getTargetProgram()));
895895

896896
return newFunc;
897897
}

source/slang/slang-ir-specialize-resources.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -1189,7 +1189,8 @@ bool specializeResourceUsage(
11891189
// and turned into SSA temporaries. Such optimization may enable
11901190
// the following passes to "see" and specialize more cases.
11911191
//
1192-
simplifyIR(codeGenContext->getTargetProgram(), irModule, IRSimplificationOptions::getFast());
1192+
simplifyIR(codeGenContext->getTargetProgram(), irModule,
1193+
IRSimplificationOptions::getFast(codeGenContext->getTargetProgram()));
11931194
result |= changed;
11941195
}
11951196
if (unspecializableFuncs.getCount() == 0)
@@ -1209,7 +1210,8 @@ bool specializeResourceUsage(
12091210
inlineCall(call);
12101211
});
12111212
}
1212-
simplifyIR(codeGenContext->getTargetProgram(), irModule, IRSimplificationOptions::getFast());
1213+
simplifyIR(codeGenContext->getTargetProgram(), irModule,
1214+
IRSimplificationOptions::getFast(codeGenContext->getTargetProgram()));
12131215
}
12141216
return result;
12151217
}

source/slang/slang-ir-specialize.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1546,7 +1546,7 @@ struct SpecializationContext
15461546
//
15471547
addToWorkList(newFunc);
15481548

1549-
simplifyFunc(targetProgram, newFunc, IRSimplificationOptions::getFast());
1549+
simplifyFunc(targetProgram, newFunc, IRSimplificationOptions::getFast(targetProgram));
15501550

15511551
return newFunc;
15521552
}
@@ -2407,7 +2407,7 @@ IRInst* specializeGenericImpl(
24072407
{
24082408
if (auto func = as<IRFunc>(specializedVal))
24092409
{
2410-
simplifyFunc(context->targetProgram, func, IRSimplificationOptions::getFast());
2410+
simplifyFunc(context->targetProgram, func, IRSimplificationOptions::getFast(context->targetProgram));
24112411
}
24122412
}
24132413

source/slang/slang-ir-ssa-simplification.cpp

+27-3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,27 @@
1515

1616
namespace Slang
1717
{
18+
IRSimplificationOptions IRSimplificationOptions::getDefault(TargetProgram* targetProgram)
19+
{
20+
IRSimplificationOptions result;
21+
result.minimalOptimization = targetProgram->getOptionSet().shouldPerformMinimumOptimizations();
22+
if (result.minimalOptimization)
23+
result.cfgOptions = CFGSimplificationOptions::getFast();
24+
else
25+
result.cfgOptions = CFGSimplificationOptions::getDefault();
26+
result.peepholeOptions = PeepholeOptimizationOptions();
27+
return result;
28+
}
29+
30+
IRSimplificationOptions IRSimplificationOptions::getFast(TargetProgram* targetProgram)
31+
{
32+
IRSimplificationOptions result;
33+
result.minimalOptimization = targetProgram->getOptionSet().shouldPerformMinimumOptimizations();
34+
result.cfgOptions = CFGSimplificationOptions::getFast();
35+
result.peepholeOptions = PeepholeOptimizationOptions();
36+
return result;
37+
}
38+
1839
// Run a combination of SSA, SCCP, SimplifyCFG, and DeadCodeElimination pass
1940
// until no more changes are possible.
2041
void simplifyIR(TargetProgram* target, IRModule* module, IRSimplificationOptions options, DiagnosticSink* sink)
@@ -50,7 +71,8 @@ namespace Slang
5071
funcChanged = false;
5172
funcChanged |= applySparseConditionalConstantPropagation(func, sink);
5273
funcChanged |= peepholeOptimize(target, func);
53-
funcChanged |= removeRedundancyInFunc(func);
74+
if (!options.minimalOptimization)
75+
funcChanged |= removeRedundancyInFunc(func);
5476
funcChanged |= simplifyCFG(func, options.cfgOptions);
5577
eliminateDeadCode(func);
5678
funcChanged |= constructSSA(func);
@@ -78,7 +100,8 @@ namespace Slang
78100
changed = false;
79101
changed |= peepholeOptimize(target, module, options.peepholeOptions);
80102

81-
changed |= removeRedundancy(module);
103+
if (!options.minimalOptimization)
104+
changed |= removeRedundancy(module);
82105
changed |= simplifyCFG(module, options.cfgOptions);
83106

84107
// Note: we disregard the `changed` state from dead code elimination pass since
@@ -103,7 +126,8 @@ namespace Slang
103126
changed = false;
104127
changed |= applySparseConditionalConstantPropagation(func, sink);
105128
changed |= peepholeOptimize(target, func);
106-
changed |= removeRedundancyInFunc(func);
129+
if (!options.minimalOptimization)
130+
changed |= removeRedundancyInFunc(func);
107131
changed |= simplifyCFG(func, options.cfgOptions);
108132

109133
// Note: we disregard the `changed` state from dead code elimination pass since

source/slang/slang-ir-ssa-simplification.h

+5-12
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,12 @@ namespace Slang
1515
{
1616
CFGSimplificationOptions cfgOptions;
1717
PeepholeOptimizationOptions peepholeOptions;
18+
bool minimalOptimization = false;
19+
20+
static IRSimplificationOptions getDefault(TargetProgram* targetProgram);
21+
22+
static IRSimplificationOptions getFast(TargetProgram* targetProgram);
1823

19-
static IRSimplificationOptions getDefault()
20-
{
21-
IRSimplificationOptions result;
22-
return result;
23-
}
24-
static IRSimplificationOptions getFast()
25-
{
26-
IRSimplificationOptions result;
27-
result.cfgOptions.removeSideEffectFreeLoops = false;
28-
result.cfgOptions.removeTrivialSingleIterationLoops = false;
29-
return result;
30-
}
3124
};
3225

3326
// Run a combination of SSA, SCCP, SimplifyCFG, and DeadCodeElimination pass

source/slang/slang-options.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ void initCommandOptions(CommandOptions& options)
290290
{ OptionKind::MatrixLayoutColumn, "-matrix-layout-column-major", nullptr, "Set the default matrix layout to column-major."},
291291
{ OptionKind::MatrixLayoutRow,"-matrix-layout-row-major", nullptr, "Set the default matrix layout to row-major."},
292292
{ OptionKind::IgnoreCapabilities,"-ignore-capabilities", nullptr, "Do not warn or error if capabilities are violated"},
293+
{ OptionKind::MinimumSlangOptimization, "-minimum-slang-optimization", nullptr, "Perform minimum code optimization in Slang to favor compilation time."},
293294
{ OptionKind::ModuleName, "-module-name", "-module-name <name>",
294295
"Set the module name to use when compiling multiple .slang source files into a single module."},
295296
{ OptionKind::Output, "-o", "-o <path>",

source/slang/slang.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -1050,6 +1050,9 @@ Linkage::Linkage(Session* session, ASTBuilder* astBuilder, Linkage* builtinLinka
10501050
for (const auto& nameToMod : builtinLinkage->mapNameToLoadedModules)
10511051
mapNameToLoadedModules.add(nameToMod);
10521052
}
1053+
1054+
m_optionSet.add(CompilerOptionName::IgnoreCapabilities, true);
1055+
m_optionSet.add(CompilerOptionName::MinimumSlangOptimization, true);
10531056
}
10541057

10551058
ISlangUnknown* Linkage::getInterface(const Guid& guid)

0 commit comments

Comments
 (0)