diff --git a/Common/CodeRefractor.RuntimeBase/Backend/ComputeClosure/MethodInterpreterCodeWriter.cs b/Common/CodeRefractor.RuntimeBase/Backend/ComputeClosure/MethodInterpreterCodeWriter.cs index 520beb59..cd5cae88 100644 --- a/Common/CodeRefractor.RuntimeBase/Backend/ComputeClosure/MethodInterpreterCodeWriter.cs +++ b/Common/CodeRefractor.RuntimeBase/Backend/ComputeClosure/MethodInterpreterCodeWriter.cs @@ -44,8 +44,7 @@ public static string WriteDelegateCallCode(MethodInterpreter interpreter) return interpreter.WriteDelegateCallCode(); } - public static bool ApplyLocalOptimizations(IEnumerable optimizationPasses, - CilMethodInterpreter interpreter) + public static bool ApplyLocalOptimizations(IEnumerable optimizationPasses, CilMethodInterpreter interpreter, ClosureEntities entities) { if (optimizationPasses == null) return false; @@ -54,9 +53,6 @@ public static bool ApplyLocalOptimizations(IEnumerable(optimizationPasses); var areOptimizationsAvailable = true; - if (interpreter.Method.Name == "pollEvents") - { - } while (areOptimizationsAvailable) { interpreter.MidRepresentation.UpdateUseDef(); @@ -64,7 +60,7 @@ public static bool ApplyLocalOptimizations(IEnumerable + diff --git a/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/Common/OptimizationPassBase.cs b/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/Common/OptimizationPassBase.cs new file mode 100644 index 00000000..2faee1e2 --- /dev/null +++ b/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/Common/OptimizationPassBase.cs @@ -0,0 +1,22 @@ +using CodeRefractor.ClosureCompute; +using CodeRefractor.MiddleEnd.Interpreters.Cil; +using CodeRefractor.RuntimeBase.Optimizations; + +namespace CodeRefractor.MiddleEnd.Optimizations.Common +{ + public abstract class OptimizationPassBase + { + public abstract bool ApplyOptimization(CilMethodInterpreter intermediateCode, ClosureEntities closure); + + public virtual bool CheckPreconditions(CilMethodInterpreter midRepresentation, ClosureEntities closure) + { + return true; + } + public OptimizationKind Kind { get; set; } + protected OptimizationPassBase(OptimizationKind kind) + { + Kind = kind; + } + + } +} \ No newline at end of file diff --git a/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/Common/ResultingOptimizationPass.cs b/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/Common/ResultingOptimizationPass.cs index e97760d9..72eba246 100644 --- a/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/Common/ResultingOptimizationPass.cs +++ b/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/Common/ResultingOptimizationPass.cs @@ -8,35 +8,26 @@ namespace CodeRefractor.MiddleEnd.Optimizations.Common { - public abstract class ResultingOptimizationPass + public abstract class ResultingOptimizationPass : OptimizationPassBase { //returns true if it succeed to apply any optimizations //Try to return false by default //If the code succeeded to optimize something that other optimizations may benefit, return true public static ClosureEntities Closure { get; set; } - protected ResultingOptimizationPass(OptimizationKind kind) + protected ResultingOptimizationPass(OptimizationKind kind) + : base(kind) { - Kind = kind; } public bool Result { get; set; } public abstract void OptimizeOperations(CilMethodInterpreter interpreter); - - - - public OptimizationKind Kind { get; set; } - - public virtual bool CheckPreconditions(CilMethodInterpreter midRepresentation) - { - return true; - } //returns true if it succeed to apply any optimizations //Try to return false by default //If the code succeeded to optimize something that other optimizations may benefit, return true - public bool Optimize(CilMethodInterpreter intermediateCode) + public bool Optimize(CilMethodInterpreter intermediateCode) { Result = false; try @@ -48,5 +39,10 @@ public bool Optimize(CilMethodInterpreter intermediateCode) } return Result; } + + public override bool ApplyOptimization(CilMethodInterpreter intermediateCode, ClosureEntities closure) + { + return Optimize(intermediateCode); + } } } \ No newline at end of file diff --git a/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/EscapeAndLowering/InFunctionLoweringVars.cs b/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/EscapeAndLowering/InFunctionLoweringVars.cs index fde9d608..86f2ed9c 100644 --- a/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/EscapeAndLowering/InFunctionLoweringVars.cs +++ b/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/EscapeAndLowering/InFunctionLoweringVars.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Linq; +using CodeRefractor.ClosureCompute; using CodeRefractor.CodeWriter.Linker; using CodeRefractor.FrontEnd.SimpleOperations; using CodeRefractor.FrontEnd.SimpleOperations.Identifiers; @@ -22,24 +23,25 @@ namespace CodeRefractor.MiddleEnd.Optimizations.EscapeAndLowering { [Optimization(Category = OptimizationCategories.Analysis)] - internal class InFunctionLoweringVars : ResultingInFunctionOptimizationPass + internal class InFunctionLoweringVars : OptimizationPassBase { - public override void OptimizeOperations(CilMethodInterpreter interpreter) + public InFunctionLoweringVars() + : base(OptimizationKind.InFunction) { - var candidateVariables = SetAllCandidateVariables(interpreter); + } + + public override bool ApplyOptimization(CilMethodInterpreter interpreter, ClosureEntities closure) + { + var candidateVariables = SetAllCandidateVariables(interpreter, closure); var useDef = interpreter.MidRepresentation.UseDef; var localOp = useDef.GetLocalOperations(); - if (interpreter.Method.Name == "Concat") - { - - } if (RemoveAllEscaping(candidateVariables, localOp, useDef)) - return; + return false; if (candidateVariables.Count == 0) - return; + return false; foreach (var variable in candidateVariables) { var getVariableData = interpreter.AnalyzeProperties.GetVariableData(variable); @@ -49,6 +51,7 @@ public override void OptimizeOperations(CilMethodInterpreter interpreter) } } AllocateVariablesOnStack(localOp, candidateVariables, interpreter); + return true; } private static bool RemoveAllEscaping(HashSet candidateVariables, LocalOperation[] localOp, @@ -74,22 +77,21 @@ private static bool RemoveAllEscaping(HashSet candidateVariables, return false; } - private static HashSet SetAllCandidateVariables(CilMethodInterpreter interpreter) + private static HashSet SetAllCandidateVariables(CilMethodInterpreter interpreter, ClosureEntities closure) { var candidateVariables = new HashSet(); var midRepresentation = interpreter.MidRepresentation; var variables = midRepresentation.Vars; - var toAdd = variables.LocalVars.Where(varId => !varId.ComputedType().GetClrType(Closure).IsPrimitive); + var toAdd = variables.LocalVars.Where(varId => !varId.ComputedType().GetClrType(closure).IsPrimitive); candidateVariables.AddRange(toAdd); - toAdd = variables.VirtRegs.Where(varId => !varId.ComputedType().GetClrType(Closure).IsPrimitive); + toAdd = variables.VirtRegs.Where(varId => !varId.ComputedType().GetClrType(closure).IsPrimitive); candidateVariables.AddRange(toAdd); - toAdd = interpreter.AnalyzeProperties.Arguments.Where(varId => !varId.ComputedType().GetClrType(Closure).IsPrimitive); + toAdd = interpreter.AnalyzeProperties.Arguments.Where(varId => !varId.ComputedType().GetClrType(closure).IsPrimitive); candidateVariables.AddRange(toAdd); return candidateVariables; } - private static void AllocateVariablesOnStack(LocalOperation[] localOp, HashSet candidateVariables, - MethodInterpreter interpreter) + private static void AllocateVariablesOnStack(LocalOperation[] localOp, HashSet candidateVariables, MethodInterpreter interpreter) { var newOps = localOp.Where(op => op.Kind == OperationKind.NewArray @@ -106,7 +108,7 @@ private static void AllocateVariablesOnStack(LocalOperation[] localOp, HashSet candidateVariables, Lo candidateVariables.Remove(right); } } + } } \ No newline at end of file diff --git a/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/Licm/LoopInvariantCodeMotion.cs b/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/Licm/LoopInvariantCodeMotion.cs index dcf8fd28..7da17d2a 100644 --- a/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/Licm/LoopInvariantCodeMotion.cs +++ b/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/Licm/LoopInvariantCodeMotion.cs @@ -1,6 +1,7 @@ #region Usings using System.Collections.Generic; +using CodeRefractor.ClosureCompute; using CodeRefractor.FrontEnd.SimpleOperations; using CodeRefractor.MiddleEnd.Interpreters.Cil; using CodeRefractor.MiddleEnd.Optimizations.Common; @@ -18,7 +19,7 @@ namespace CodeRefractor.MiddleEnd.Optimizations.Licm [Optimization(Category = OptimizationCategories.CommonSubexpressionsElimination)] internal class LoopInvariantCodeMotion : ResultingGlobalOptimizationPass { - public override bool CheckPreconditions(CilMethodInterpreter midRepresentation) + public override bool CheckPreconditions(CilMethodInterpreter midRepresentation, ClosureEntities entities) { var loopStarts = LoopDetection.FindLoops(midRepresentation.MidRepresentation); return loopStarts.Count != 0; diff --git a/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/Purity/EvaluatePureFunctionWithConstantCall.cs b/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/Purity/EvaluatePureFunctionWithConstantCall.cs index ea9ed3b2..a1389b09 100644 --- a/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/Purity/EvaluatePureFunctionWithConstantCall.cs +++ b/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/Purity/EvaluatePureFunctionWithConstantCall.cs @@ -1,6 +1,7 @@ #region Usings using System.Collections.Generic; +using CodeRefractor.ClosureCompute; using CodeRefractor.CodeWriter.Linker; using CodeRefractor.FrontEnd.SimpleOperations; using CodeRefractor.FrontEnd.SimpleOperations.Identifiers; @@ -19,7 +20,7 @@ namespace CodeRefractor.MiddleEnd.Optimizations.Purity [Optimization(Category = OptimizationCategories.Purity)] internal class EvaluatePureFunctionWithConstantCall : ResultingGlobalOptimizationPass { - public override bool CheckPreconditions(CilMethodInterpreter midRepresentation) + public override bool CheckPreconditions(CilMethodInterpreter midRepresentation, ClosureEntities entities) { var operations = midRepresentation.MidRepresentation.UseDef; diff --git a/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/SimpleDce/AssignToReturnPropagation.cs b/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/SimpleDce/AssignToReturnPropagation.cs index f153e7a4..89e61e80 100644 --- a/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/SimpleDce/AssignToReturnPropagation.cs +++ b/Common/CodeRefractor.RuntimeBase/MiddleEnd/Optimizations/SimpleDce/AssignToReturnPropagation.cs @@ -1,5 +1,6 @@ #region Usings +using CodeRefractor.ClosureCompute; using CodeRefractor.FrontEnd.SimpleOperations.Methods; using CodeRefractor.MiddleEnd.Interpreters.Cil; using CodeRefractor.MiddleEnd.Optimizations.Common; @@ -23,7 +24,7 @@ namespace CodeRefractor.MiddleEnd.Optimizations.SimpleDce [Optimization(Category = OptimizationCategories.DeadCodeElimination)] internal class AssignToReturnPropagation : ResultingInFunctionOptimizationPass { - public override bool CheckPreconditions(CilMethodInterpreter midRepresentation) + public override bool CheckPreconditions(CilMethodInterpreter midRepresentation, ClosureEntities entities) { var localOperations = midRepresentation.MidRepresentation.UseDef.GetLocalOperations(); return localOperations.Length >= 2;