Author: Carl Friedrich Bolz <cfb...@gmx.de> Branch: Changeset: r87704:018a54181f0f Date: 2016-10-11 12:10 +0200 http://bitbucket.org/pypy/pypy/changeset/018a54181f0f/
Log: kill the pure_reverse function and just move the parts to the relevant postprocess_* functions. It doesn't make sense to dispatch *twice* on the opnum. diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py --- a/rpython/jit/metainterp/optimizeopt/optimizer.py +++ b/rpython/jit/metainterp/optimizeopt/optimizer.py @@ -865,63 +865,6 @@ return opinfo is not None and opinfo.is_virtual() return False - def pure_reverse(self, op): - import sys - if self.optpure is None: - return - optpure = self.optpure - if op.getopnum() == rop.INT_ADD: - arg0 = op.getarg(0) - arg1 = op.getarg(1) - optpure.pure_from_args(rop.INT_ADD, [arg1, arg0], op) - # Synthesize the reverse op for optimize_default to reuse - optpure.pure_from_args(rop.INT_SUB, [op, arg1], arg0) - optpure.pure_from_args(rop.INT_SUB, [op, arg0], arg1) - if isinstance(arg0, ConstInt): - # invert the constant - i0 = arg0.getint() - if i0 == -sys.maxint - 1: - return - inv_arg0 = ConstInt(-i0) - elif isinstance(arg1, ConstInt): - # commutative - i0 = arg1.getint() - if i0 == -sys.maxint - 1: - return - inv_arg0 = ConstInt(-i0) - arg1 = arg0 - else: - return - optpure.pure_from_args(rop.INT_SUB, [arg1, inv_arg0], op) - optpure.pure_from_args(rop.INT_SUB, [arg1, op], inv_arg0) - optpure.pure_from_args(rop.INT_ADD, [op, inv_arg0], arg1) - optpure.pure_from_args(rop.INT_ADD, [inv_arg0, op], arg1) - - elif op.getopnum() == rop.INT_SUB: - arg0 = op.getarg(0) - arg1 = op.getarg(1) - optpure.pure_from_args(rop.INT_ADD, [op, arg1], arg0) - optpure.pure_from_args(rop.INT_SUB, [arg0, op], arg1) - if isinstance(arg1, ConstInt): - # invert the constant - i1 = arg1.getint() - if i1 == -sys.maxint - 1: - return - inv_arg1 = ConstInt(-i1) - optpure.pure_from_args(rop.INT_ADD, [arg0, inv_arg1], op) - optpure.pure_from_args(rop.INT_ADD, [inv_arg1, arg0], op) - optpure.pure_from_args(rop.INT_SUB, [op, inv_arg1], arg0) - optpure.pure_from_args(rop.INT_SUB, [op, arg0], inv_arg1) - elif op.getopnum() == rop.FLOAT_MUL: - optpure.pure_from_args(rop.FLOAT_MUL, - [op.getarg(1), op.getarg(0)], op) - elif op.getopnum() == rop.FLOAT_NEG: - optpure.pure_from_args(rop.FLOAT_NEG, [op], op.getarg(0)) - elif op.getopnum() == rop.CAST_INT_TO_PTR: - optpure.pure_from_args(rop.CAST_PTR_TO_INT, [op], op.getarg(0)) - elif op.getopnum() == rop.CAST_PTR_TO_INT: - optpure.pure_from_args(rop.CAST_INT_TO_PTR, [op], op.getarg(0)) - # These are typically removed already by OptRewrite, but it can be # dissabled and unrolling emits some SAME_AS ops to setup the # optimizier state. These needs to always be optimized out. diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py --- a/rpython/jit/metainterp/optimizeopt/rewrite.py +++ b/rpython/jit/metainterp/optimizeopt/rewrite.py @@ -143,7 +143,21 @@ return self.emit(op) def postprocess_INT_SUB(self, op): - self.optimizer.pure_reverse(op) + import sys + arg0 = op.getarg(0) + arg1 = op.getarg(1) + self.optimizer.pure_from_args(rop.INT_ADD, [op, arg1], arg0) + self.optimizer.pure_from_args(rop.INT_SUB, [arg0, op], arg1) + if isinstance(arg1, ConstInt): + # invert the constant + i1 = arg1.getint() + if i1 == -sys.maxint - 1: + return + inv_arg1 = ConstInt(-i1) + self.optimizer.pure_from_args(rop.INT_ADD, [arg0, inv_arg1], op) + self.optimizer.pure_from_args(rop.INT_ADD, [inv_arg1, arg0], op) + self.optimizer.pure_from_args(rop.INT_SUB, [op, inv_arg1], arg0) + self.optimizer.pure_from_args(rop.INT_SUB, [op, arg0], inv_arg1) def optimize_INT_ADD(self, op): if self.is_raw_ptr(op.getarg(0)) or self.is_raw_ptr(op.getarg(1)): @@ -162,7 +176,32 @@ return self.emit(op) def postprocess_INT_ADD(self, op): - self.optimizer.pure_reverse(op) + import sys + arg0 = op.getarg(0) + arg1 = op.getarg(1) + self.optimizer.pure_from_args(rop.INT_ADD, [arg1, arg0], op) + # Synthesize the reverse op for optimize_default to reuse + self.optimizer.pure_from_args(rop.INT_SUB, [op, arg1], arg0) + self.optimizer.pure_from_args(rop.INT_SUB, [op, arg0], arg1) + if isinstance(arg0, ConstInt): + # invert the constant + i0 = arg0.getint() + if i0 == -sys.maxint - 1: + return + inv_arg0 = ConstInt(-i0) + elif isinstance(arg1, ConstInt): + # commutative + i0 = arg1.getint() + if i0 == -sys.maxint - 1: + return + inv_arg0 = ConstInt(-i0) + arg1 = arg0 + else: + return + self.optimizer.pure_from_args(rop.INT_SUB, [arg1, inv_arg0], op) + self.optimizer.pure_from_args(rop.INT_SUB, [arg1, op], inv_arg0) + self.optimizer.pure_from_args(rop.INT_ADD, [op, inv_arg0], arg1) + self.optimizer.pure_from_args(rop.INT_ADD, [inv_arg0, op], arg1) def optimize_INT_MUL(self, op): arg1 = self.get_box_replacement(op.getarg(0)) @@ -250,7 +289,8 @@ return self.emit(op) def postprocess_FLOAT_MUL(self, op): - self.optimizer.pure_reverse(op) + self.optimizer.pure_from_args(rop.FLOAT_MUL, + [op.getarg(1), op.getarg(0)], op) def optimize_FLOAT_TRUEDIV(self, op): arg1 = op.getarg(0) @@ -277,7 +317,7 @@ return self.emit(op) def postprocess_FLOAT_NEG(self, op): - self.optimizer.pure_reverse(op) + self.optimizer.pure_from_args(rop.FLOAT_NEG, [op], op.getarg(0)) def optimize_guard(self, op, constbox): box = op.getarg(0) @@ -799,11 +839,11 @@ return True def optimize_CAST_PTR_TO_INT(self, op): - self.optimizer.pure_reverse(op) + self.optimizer.pure_from_args(rop.CAST_INT_TO_PTR, [op], op.getarg(0)) return self.emit(op) def optimize_CAST_INT_TO_PTR(self, op): - self.optimizer.pure_reverse(op) + self.optimizer.pure_from_args(rop.CAST_PTR_TO_INT, [op], op.getarg(0)) return self.emit(op) def optimize_SAME_AS_I(self, op): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit