MCPcopy Create free account
hub / github.com/GaijinEntertainment/daScript / optimize

Method optimize

src/ast/ast_program.cpp:634–682  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

632 }
633
634 void Program::optimize(TextWriter & logs, ModuleGroup & libGroup) {
635 bool logOpt = options.getBoolOption("log_optimization",false);
636 bool logPass = options.getBoolOption("log_optimization_passes",false);
637 bool log = logOpt || logPass;
638 bool any, last;
639 int optimizationRound = 1;
640 if (log) {
641 logs << *this << "\n";
642 }
643 do {
644 if ( log ) logs << "OPTIMIZE " << optimizationRound << ":\n"; if ( logPass ) logs << *this;
645 any = false;
646 last = optimizationRefFolding(optimizationRound); if ( failed() ) break; any |= last;
647 if ( log ) logs << "REF FOLDING: " << (last ? "optimized" : "nothing") << "\n"; if ( logPass ) logs << *this;
648 last = optimizationUnused(logs, optimizationRound); if ( failed() ) break; any |= last;
649 if ( log ) logs << "REMOVE UNUSED:" << (last ? "optimized" : "nothing") << "\n"; if ( logPass ) logs << *this;
650 last = optimizationConstFolding(optimizationRound); if ( failed() ) break; any |= last;
651 if ( log ) logs << "CONST FOLDING:" << (last ? "optimized" : "nothing") << "\n"; if ( logPass ) logs << *this;
652 last = optimizationCondFolding(optimizationRound); if ( failed() ) break; any |= last;
653 if ( log ) logs << "COND FOLDING:" << (last ? "optimized" : "nothing") << "\n"; if ( logPass ) logs << *this;
654 last = optimizationBlockFolding(optimizationRound); if ( failed() ) break; any |= last;
655 if ( log ) logs << "BLOCK FOLDING:" << (last ? "optimized" : "nothing") << "\n"; if ( logPass ) logs << *this;
656 // this is here again for a reason
657 last = optimizationUnused(logs, optimizationRound); if ( failed() ) break; any |= last;
658 if ( log ) logs << "REMOVE UNUSED:" << (last ? "optimized" : "nothing") << "\n"; if ( logPass ) logs << *this;
659 // now, user macros
660 last = false;
661 auto modMacro = [&](Module * mod) -> bool { // we run all macros for each module
662 if ( thisModule->isVisibleDirectly(mod) && mod!=thisModule.get() ) {
663 for ( const auto & pm : mod->optimizationMacros ) {
664 last |= pm->apply(this, thisModule.get());
665 if ( failed() ) { // if macro failed, we report it, and we are done
666 error("optimization macro " + mod->name + "::" + pm->name + " failed", "","",LineInfo(), CompilationError::runtime_macro);
667 return false;
668 }
669 }
670 }
671 return true;
672 };
673 Module::foreach(modMacro);
674 if ( failed() ) break;
675 any |= last;
676 libGroup.foreach(modMacro,"*");
677 if ( failed() ) break;
678 any |= last;
679 if ( log ) logs << "MACROS:" << (last ? "optimized" : "nothing") << "\n"; if ( logPass ) logs << *this;
680 optimizationRound++;
681 } while ( any );
682 }
683
684}

Callers 1

parseDaScriptFunction · 0.45

Calls 6

getBoolOptionMethod · 0.80
failedFunction · 0.50
LineInfoClass · 0.50
getMethod · 0.45
applyMethod · 0.45
foreachMethod · 0.45

Tested by

no test coverage detected