4141#include < limits>
4242
4343#include " iree/compiler/API/Internal/Diagnostics.h"
44+ #include " iree/compiler/Codegen/Common/Options.h"
45+ #include " iree/compiler/Codegen/Common/Passes.h"
4446#include " iree/compiler/ConstEval/Passes.h"
4547#include " iree/compiler/Dialect/VM/Target/init_targets.h"
4648#include " iree/compiler/Dialect/VM/Transforms/Passes.h"
@@ -250,6 +252,7 @@ struct GlobalInit {
250252 ParameterOptions *clParameterOptions = nullptr ;
251253 DispatchCreationOptions *clDispatchCreationOptions = nullptr ;
252254 SchedulingOptions *clSchedulingOptions = nullptr ;
255+ TuningSpecOptions *clTuningSpecOptions = nullptr ;
253256 IREE::HAL::TargetOptions *clHalTargetOptions = nullptr ;
254257 IREE::VM::TargetOptions *clVmTargetOptions = nullptr ;
255258 IREE::VM::BytecodeTargetOptions *clBytecodeTargetOptions = nullptr ;
@@ -297,6 +300,7 @@ void GlobalInit::registerCommandLineOptions() {
297300 clParameterOptions = &ParameterOptions::FromFlags::get ();
298301 clDispatchCreationOptions = &DispatchCreationOptions::FromFlags::get ();
299302 clSchedulingOptions = &SchedulingOptions::FromFlags::get ();
303+ clTuningSpecOptions = &TuningSpecOptions::FromFlags::get ();
300304 clHalTargetOptions = &IREE::HAL::TargetOptions::FromFlags::get ();
301305 clVmTargetOptions = &IREE::VM::TargetOptions::FromFlags::get ();
302306 clBytecodeTargetOptions = &IREE::VM::BytecodeTargetOptions::FromFlags::get ();
@@ -409,6 +413,7 @@ struct Session {
409413 GlobalOptimizationOptions highLevelOptimizationOptions;
410414 DispatchCreationOptions dispatchCreationOptions;
411415 SchedulingOptions schedulingOptions;
416+ TuningSpecOptions tuningSpecOptions;
412417 IREE::HAL::TargetOptions halTargetOptions;
413418 IREE::VM::TargetOptions vmTargetOptions;
414419 IREE::VM::BytecodeTargetOptions bytecodeTargetOptions;
@@ -438,6 +443,7 @@ Session::Session(GlobalInit &globalInit)
438443 parameterOptions = *globalInit.clParameterOptions ;
439444 dispatchCreationOptions = *globalInit.clDispatchCreationOptions ;
440445 schedulingOptions = *globalInit.clSchedulingOptions ;
446+ tuningSpecOptions = *globalInit.clTuningSpecOptions ;
441447 halTargetOptions = *globalInit.clHalTargetOptions ;
442448 vmTargetOptions = *globalInit.clVmTargetOptions ;
443449 bytecodeTargetOptions = *globalInit.clBytecodeTargetOptions ;
@@ -460,6 +466,7 @@ Session::Session(GlobalInit &globalInit)
460466 parameterOptions.bindOptions (binder);
461467 dispatchCreationOptions.bindOptions (binder);
462468 schedulingOptions.bindOptions (binder);
469+ tuningSpecOptions.bindOptions (binder);
463470 halTargetOptions.bindOptions (binder);
464471 vmTargetOptions.bindOptions (binder);
465472 bytecodeTargetOptions.bindOptions (binder);
@@ -1000,6 +1007,18 @@ bool Invocation::runPipeline(enum iree_compiler_pipeline_t pipeline) {
10001007 }
10011008 });
10021009
1010+ // Only pipelines that use MaterializeTuningSpecsPass need tuning spec
1011+ // options. STD and HAL_EXECUTABLE both run buildHALTransformPassPipeline
1012+ // which includes ConfigureExecutablesPass that adds
1013+ // MaterializeTuningSpecsPass.
1014+ bool needsTuningSpecs = (pipeline == IREE_COMPILER_PIPELINE_STD ||
1015+ pipeline == IREE_COMPILER_PIPELINE_HAL_EXECUTABLE);
1016+ if (needsTuningSpecs) {
1017+ setGlobalTuningSpecOptions (&session.tuningSpecOptions );
1018+ }
1019+ auto resetTuningSpecOptions =
1020+ llvm::scope_exit ([&]() { setGlobalTuningSpecOptions (nullptr ); });
1021+
10031022 switch (pipeline) {
10041023 case IREE_COMPILER_PIPELINE_STD: {
10051024 IREEVMPipelinePhase compileFrom;
@@ -1089,10 +1108,13 @@ bool Invocation::runTextualPassPipeline(const char *textPassPipeline) {
10891108 llvm::errs ()))) {
10901109 return false ;
10911110 }
1092- if (failed (passManager->run (parsedModule))) {
1093- return false ;
1094- }
1095- return true ;
1111+
1112+ // Inject tuning spec options before pipeline execution.
1113+ setGlobalTuningSpecOptions (&session.tuningSpecOptions );
1114+ auto resetTuningSpecOptions =
1115+ llvm::scope_exit ([&]() { setGlobalTuningSpecOptions (nullptr ); });
1116+
1117+ return succeeded (passManager->run (parsedModule));
10961118}
10971119
10981120Error *Invocation::outputIR (Output &output) {
0 commit comments