//[TestMethod]
        //public void RemoveUnneededStorePositionOptimization() => OptimizationEffectiveness<RemoveUnusedStorePositionOptimization>();

        private void OptimizationEffectiveness <T>()
        {
            var optimizations = new OptimizationBase[] {
                new CharCheckOptimization(),
                new JumpOptimization(true),
                new RemoveUnusedVariablesOptimization(),
                new MergeVariableOptimization(),
                new ConsolidateBoundChecksOptimization(),
                new DelayAdvanceOptimization(),
                new RemoveUnneededRestorePositionOptimization(),
                new RemoveUnusedStorePositionOptimization(),
                new DelayStorePositionOptimization(),
                new RemoveUnusedAdvancesOptimization(),
                new DelayBoundsCheckOptimization(),
                new DeduplicationOptimization(),
                new RemoveUnneededChecksOptimization(true),
                new RemoveUnneededVariableOperationsOptimization(),
                new FastPathOptimization(),
                new PrefixUnificationOptimization(),
            };

            TestEffectiveness(typeof(T).Name, new DefaultOptimizer()
            {
                Optimizations     = optimizations.Where(o => !(o is T)).ToArray(),
                RareOptimizations = new OptimizationBase[0]
            }, new DefaultOptimizer()
            {
                Optimizations     = optimizations,
                RareOptimizations = new OptimizationBase[0]
            });
        }
Exemple #2
0
        private Method OptimizeSingleMethod(Method m)
        {
            var cleanup = new OptimizationBase[] {
                new QuickCleanupOptimization(),
            };

            var context = new OptimizationContext(m);

            for (var i = 0; i < 255; i++)
            {
                Debug.WriteLine($"Optimization iteration {i}");

                var changed = Optimize(context, cleanup);
                foreach (var optimizer in Optimizations)
                {
                    if (optimizer.Optimize(context))
                    {
                        if (Optimize(context, cleanup))
                        {
                            // TODO: Make sure cleanup needs only 1 iteration
                            while (Optimize(context, cleanup))
                            {
                            }
                        }

                        changed = true;
                    }
                }

                if (!changed)
                {
                    foreach (var optimizer in RareOptimizations)
                    {
                        changed |= optimizer.Optimize(context);
                    }

                    if (!changed)
                    {
                        break;
                    }
                }
            }

            foreach (var c in cleanup)
            {
                c.Optimize(context);
            }

            return(new Method(m.Name, context.Instructions, m.CharacterRanges, context.FailureLabelMap, context.VariableAllocator, context.LabelAllocator));
        }