diff --git a/opt.py b/opt.py index 050a130..ce64747 100644 --- a/opt.py +++ b/opt.py @@ -35,6 +35,27 @@ def collapse_constant_additions(expr: Expression) -> Option[Expression]: return Some(Application(Builtin(Builtin.BB_PLUS_CONST(x+y)), val)) return None +def eliminate_identity_operations(expr: Expression) -> Option[Expression]: + match expr: + case Application(Builtin(Builtin.BB_PLUS_CONST(0)), val): + print('BBBBBBBB') + return Some(val) + case Application(MonoFunc(arg, Variable(bod_var)), val): + if arg == bod_var: + print('CCCCCCCCCCCCCcc') + return Some(val) + return None + +def identify_constant_additions(expr: Expression): + match expr: + case Application(Builtin(Builtin.BB_PLUS()), Int(x)): + print('AAAααααα') + return Some(Builtin(Builtin.BB_PLUS_CONST(x))) + case Application(Application(Builtin(Builtin.BB_PLUS()), expr1), Int(x)): + print('DDDDDDDDDDD') + return Some(Application(Builtin(Builtin.BB_PLUS_CONST(x)), expr1)) + return None + def apply_opts(optimizations: Collection[Optimization], expression: Expression) -> Tuple[Expression, int]: count: int optimized_expr: Expression @@ -89,4 +110,7 @@ def optimize_to_fixpoint(optimizations: Collection[Optimization], expression: Ex return optimize_to_fixpoint(optimizations, optimized_expression) raise Exception('Unreachable') -all_optimizations: Sequence[Optimization] = (eliminate_single_let, collapse_constant_additions) \ No newline at end of file +all_optimizations: Sequence[Optimization] = (eliminate_single_let, + collapse_constant_additions, + eliminate_identity_operations, + identify_constant_additions) \ No newline at end of file