Skip to content

Commit 3e91cf1

Browse files
committed
Plumb options to DCE pass.
1 parent 15d2600 commit 3e91cf1

6 files changed

+50
-23
lines changed

source/slang/slang-emit.cpp

+6-4
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,9 @@ Result linkAndOptimizeIR(
479479

480480
IRSimplificationOptions defaultIRSimplificationOptions = IRSimplificationOptions::getDefault(targetProgram);
481481
IRSimplificationOptions fastIRSimplificationOptions = IRSimplificationOptions::getFast(targetProgram);
482+
IRDeadCodeEliminationOptions deadCodeEliminationOptions = IRDeadCodeEliminationOptions();
482483
fastIRSimplificationOptions.minimalOptimization = defaultIRSimplificationOptions.minimalOptimization;
484+
deadCodeEliminationOptions.useFastAnalysis = fastIRSimplificationOptions.minimalOptimization;
483485

484486
simplifyIR(targetProgram, irModule, defaultIRSimplificationOptions, sink);
485487

@@ -535,7 +537,7 @@ Result linkAndOptimizeIR(
535537
dumpIRIfEnabled(codeGenContext, irModule, "AFTER-SPECIALIZE");
536538

537539
applySparseConditionalConstantPropagation(irModule, codeGenContext->getSink());
538-
eliminateDeadCode(irModule);
540+
eliminateDeadCode(irModule, deadCodeEliminationOptions);
539541

540542
validateIRModuleIfEnabled(codeGenContext, irModule);
541543

@@ -627,7 +629,7 @@ Result linkAndOptimizeIR(
627629

628630
if (fastIRSimplificationOptions.minimalOptimization)
629631
{
630-
eliminateDeadCode(irModule);
632+
eliminateDeadCode(irModule, deadCodeEliminationOptions);
631633
}
632634
else
633635
{
@@ -1078,7 +1080,7 @@ Result linkAndOptimizeIR(
10781080
//
10791081
// We run DCE pass again to clean things up.
10801082
//
1081-
eliminateDeadCode(irModule);
1083+
eliminateDeadCode(irModule, deadCodeEliminationOptions);
10821084

10831085
if (isKhronosTarget(targetRequest))
10841086
{
@@ -1139,7 +1141,7 @@ Result linkAndOptimizeIR(
11391141
if (emitSpirvDirectly)
11401142
{
11411143
performIntrinsicFunctionInlining(irModule);
1142-
eliminateDeadCode(irModule);
1144+
eliminateDeadCode(irModule, deadCodeEliminationOptions);
11431145
}
11441146
eliminateMultiLevelBreak(irModule);
11451147

source/slang/slang-ir-dce.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,11 @@ bool shouldInstBeLiveIfParentIsLive(IRInst* inst, IRDeadCodeEliminationOptions o
307307
// First, if `inst` is an instruction that might have some effects
308308
// when it is executed, then we should keep it around.
309309
//
310-
if (inst->mightHaveSideEffects(SideEffectAnalysisOptions::None))
310+
SideEffectAnalysisOptions sideEffectOptions = options.useFastAnalysis
311+
? SideEffectAnalysisOptions::None
312+
: SideEffectAnalysisOptions::UseDominanceTree;
313+
314+
if (inst->mightHaveSideEffects(sideEffectOptions))
311315
{
312316
return true;
313317
}

source/slang/slang-ir-dce.h

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ namespace Slang
1111
{
1212
bool keepExportsAlive = false;
1313
bool keepLayoutsAlive = false;
14+
bool useFastAnalysis = false;
1415
};
1516

1617
/// Eliminate "dead" code from the given IR module.

source/slang/slang-ir-peephole.cpp

+17-9
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ struct PeepholeContext : InstPassBase
1111
{
1212
PeepholeContext(IRModule* inModule)
1313
: InstPassBase(inModule)
14-
{}
14+
{
15+
}
1516

1617
bool changed = false;
1718
FloatingPointMode floatingPointMode = FloatingPointMode::Precise;
1819
bool removeOldInst = true;
1920
bool isInGeneric = false;
2021
bool isPrelinking = false;
22+
bool useFastAnalysis = false;
2123

2224
TargetProgram* targetProgram;
2325

@@ -350,7 +352,7 @@ struct PeepholeContext : InstPassBase
350352
}
351353
else
352354
{
353-
//changed |= tryFoldElementExtractFromUpdateInst(inst);
355+
changed |= tryFoldElementExtractFromUpdateInst(inst);
354356
}
355357
break;
356358
case kIROp_GetElement:
@@ -415,7 +417,7 @@ struct PeepholeContext : InstPassBase
415417
}
416418
else
417419
{
418-
//changed |= tryFoldElementExtractFromUpdateInst(inst);
420+
changed |= tryFoldElementExtractFromUpdateInst(inst);
419421
}
420422
break;
421423
case kIROp_UpdateElement:
@@ -846,7 +848,7 @@ struct PeepholeContext : InstPassBase
846848
case kIROp_Div:
847849
case kIROp_And:
848850
case kIROp_Or:
849-
//changed |= tryOptimizeArithmeticInst(inst);
851+
changed |= tryOptimizeArithmeticInst(inst);
850852
break;
851853
case kIROp_Param:
852854
{
@@ -895,8 +897,7 @@ struct PeepholeContext : InstPassBase
895897
// Never remove param inst.
896898
changed = true;
897899
}
898-
#if 0
899-
else
900+
else if (!useFastAnalysis)
900901
{
901902
// If argValue is defined locally,
902903
// we can replace only if argVal dominates inst.
@@ -913,7 +914,6 @@ struct PeepholeContext : InstPassBase
913914
changed = true;
914915
}
915916
}
916-
#endif
917917
}
918918
}
919919
}
@@ -1120,7 +1120,8 @@ struct PeepholeContext : InstPassBase
11201120

11211121
bool processFunc(IRInst* func)
11221122
{
1123-
func->getModule()->invalidateAllAnalysis();
1123+
if (!useFastAnalysis)
1124+
func->getModule()->invalidateAllAnalysis();
11241125

11251126
bool lastIsInGeneric = isInGeneric;
11261127
if (!isInGeneric)
@@ -1153,21 +1154,27 @@ bool peepholeOptimize(TargetProgram* target, IRModule* module, PeepholeOptimizat
11531154
PeepholeContext context = PeepholeContext(module);
11541155
context.targetProgram = target;
11551156
context.isPrelinking = options.isPrelinking;
1157+
context.useFastAnalysis = target
1158+
? target->getOptionSet().getBoolOption(CompilerOptionName::MinimumSlangOptimization)
1159+
: true;
11561160
return context.processModule();
11571161
}
11581162

11591163
bool peepholeOptimize(TargetProgram* target, IRInst* func)
11601164
{
11611165
PeepholeContext context = PeepholeContext(func->getModule());
11621166
context.targetProgram = target;
1167+
context.useFastAnalysis = target
1168+
? target->getOptionSet().getBoolOption(CompilerOptionName::MinimumSlangOptimization)
1169+
: true;
11631170
return context.processFunc(func);
11641171
}
11651172

11661173
bool peepholeOptimizeGlobalScope(TargetProgram* target, IRModule* module)
11671174
{
11681175
PeepholeContext context = PeepholeContext(module);
11691176
context.targetProgram = target;
1170-
1177+
context.useFastAnalysis = true;
11711178
bool result = false;
11721179
for (;;)
11731180
{
@@ -1189,6 +1196,7 @@ bool tryReplaceInstUsesWithSimplifiedValue(TargetProgram* target, IRModule* modu
11891196
PeepholeContext context = PeepholeContext(inst->getModule());
11901197
context.targetProgram = target;
11911198
context.removeOldInst = false;
1199+
context.useFastAnalysis = true;
11921200
context.processInst(inst);
11931201
return context.changed;
11941202
}

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

+12-4
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ namespace Slang
4545
const int kMaxIterations = 8;
4646
const int kMaxFuncIterations = 16;
4747
int iterationCounter = 0;
48+
IRDeadCodeEliminationOptions dceOptions = IRDeadCodeEliminationOptions();
49+
dceOptions.useFastAnalysis = options.minimalOptimization;
4850

4951
while (changed && iterationCounter < kMaxIterations)
5052
{
@@ -77,7 +79,7 @@ namespace Slang
7779
// Note: we disregard the `changed` state from dead code elimination pass since
7880
// SCCP pass could be generating temporarily evaluated constant values and never actually use them.
7981
// DCE will always remove those nearly generated consts and always returns true here.
80-
eliminateDeadCode(func);
82+
eliminateDeadCode(func, dceOptions);
8183
if (funcIterationCount == 0)
8284
funcChanged |= constructSSA(func);
8385
changed |= funcChanged;
@@ -86,14 +88,17 @@ namespace Slang
8688
}
8789
iterationCounter++;
8890
}
89-
eliminateDeadCode(module);
91+
eliminateDeadCode(module, dceOptions);
9092
}
9193

9294
void simplifyNonSSAIR(TargetProgram* target, IRModule* module, IRSimplificationOptions options)
9395
{
9496
bool changed = true;
9597
const int kMaxIterations = 8;
9698
int iterationCounter = 0;
99+
IRDeadCodeEliminationOptions dceOptions = IRDeadCodeEliminationOptions();
100+
dceOptions.useFastAnalysis = options.minimalOptimization;
101+
97102
while (changed && iterationCounter < kMaxIterations)
98103
{
99104
changed = false;
@@ -106,14 +111,17 @@ namespace Slang
106111
// Note: we disregard the `changed` state from dead code elimination pass since
107112
// SCCP pass could be generating temporarily evaluated constant values and never actually use them.
108113
// DCE will always remove those nearly generated consts and always returns true here.
109-
eliminateDeadCode(module);
114+
eliminateDeadCode(module, dceOptions);
110115
iterationCounter++;
111116
}
112117
}
113118

114119

115120
void simplifyFunc(TargetProgram* target, IRGlobalValueWithCode* func, IRSimplificationOptions options, DiagnosticSink* sink)
116121
{
122+
IRDeadCodeEliminationOptions dceOptions = IRDeadCodeEliminationOptions();
123+
dceOptions.useFastAnalysis = options.minimalOptimization;
124+
117125
bool changed = true;
118126
const int kMaxIterations = 8;
119127
int iterationCounter = 0;
@@ -132,7 +140,7 @@ namespace Slang
132140
// Note: we disregard the `changed` state from dead code elimination pass since
133141
// SCCP pass could be generating temporarily evaluated constant values and never actually use them.
134142
// DCE will always remove those nearly generated consts and always returns true here.
135-
eliminateDeadCode(func);
143+
eliminateDeadCode(func, dceOptions);
136144

137145
changed |= constructSSA(func);
138146

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

+9-5
Original file line numberDiff line numberDiff line change
@@ -10834,12 +10834,18 @@ RefPtr<IRModule> generateIRForTranslationUnit(
1083410834
constructSSA(module);
1083510835
simplifyCFG(module, CFGSimplificationOptions::getDefault());
1083610836
applySparseConditionalConstantPropagation(module, compileRequest->getSink());
10837-
peepholeOptimize(nullptr, module, PeepholeOptimizationOptions::getPrelinking());
10837+
auto peepholeOptions = PeepholeOptimizationOptions::getPrelinking();
10838+
peepholeOptimize(nullptr, module, peepholeOptions);
10839+
10840+
IRDeadCodeEliminationOptions dceOptions = IRDeadCodeEliminationOptions();
10841+
dceOptions.keepExportsAlive = true;
10842+
dceOptions.keepLayoutsAlive = true;
10843+
dceOptions.useFastAnalysis = true;
1083810844

1083910845
for (auto inst : module->getGlobalInsts())
1084010846
{
1084110847
if (auto func = as<IRGlobalValueWithCode>(inst))
10842-
eliminateDeadCode(func);
10848+
eliminateDeadCode(func, dceOptions);
1084310849
}
1084410850
// Next, inline calls to any functions that have been
1084510851
// marked for mandatory "early" inlining.
@@ -10963,9 +10969,7 @@ RefPtr<IRModule> generateIRForTranslationUnit(
1096310969
// pass here, but make sure to set our options so that we don't
1096410970
// eliminate anything that has been marked for export.
1096510971
//
10966-
IRDeadCodeEliminationOptions options;
10967-
options.keepExportsAlive = true;
10968-
eliminateDeadCode(module, options);
10972+
eliminateDeadCode(module, dceOptions);
1096910973

1097010974
if (linkage->m_optionSet.shouldObfuscateCode())
1097110975
{

0 commit comments

Comments
 (0)