private void Optimize() { _augmentedVariablesIndex = 1; //Make a copy of the compiled body of the macro for manipulation during optimization _optimizedBlock = HlMacroBodyCompiler.Compile(BaseMacro.CompiledBody); //Update use chains information _updateChainFlag = true; UpdateChains(); //Replace all partial value access in the LHS of assignment commands with equivalent code on full l-values Optimize_ReplaceAllLHSPartialAccess(); //Convert code to SSA form (Static Single-Assignment form) Optimize_ConvertToSSAForm(); //Remove dead code Optimize_RemoveDeadCommands(); //Perform several passes of value propagation process _updateChainFlag = true; while (_updateChainFlag) { _updateChainFlag = false; //Evaluate simple expressions (i.e. basic expressions on constant values) and propagate the values Optimize_FoldSimpleExpressions(); //Remove redundant basic expressions Optimize_PropagateCommonRHSBasicExpressions(); //Propagate assignmets of atomic expressions to l-values Optimize_PropagateRHSAtomicExpressions(); } //Fill the final optimized macro command block body FillOptimizedCommandBlock(); }
internal static CommandBlock Compile(CommandBlock macroCommandBlock) { if (!(macroCommandBlock.ParentLanguageSymbol is GMacMacro)) { throw new InvalidOperationException("The given command block is not a macro body"); } var baseMacro = (GMacMacro)macroCommandBlock.ParentLanguageSymbol; var compiler = new HlMacroBodyCompiler(baseMacro); compiler._compiledBlock = CommandBlock.Create(compiler.BaseMacro); foreach (var param in compiler.BaseMacro.Parameters) { compiler.ActiveAr.AddSymbolData(param, param); } macroCommandBlock.AcceptVisitor(compiler); return(compiler._compiledBlock); }