예제 #1
0
        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();
        }
예제 #2
0
        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);
        }