Author: Armin Rigo <[email protected]>
Branch: conditional_call_value_4
Changeset: r88577:dbe7fb152fc7
Date: 2016-11-23 11:58 +0100
http://bitbucket.org/pypy/pypy/changeset/dbe7fb152fc7/
Log: next test passing
diff --git a/rpython/jit/metainterp/optimizeopt/pure.py
b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -151,13 +151,13 @@
self._pure_operations[opnum] = recentops = RecentPureOps()
return recentops
- def optimize_CALL_PURE_I(self, op):
+ def optimize_call_pure(self, op, start_index=0):
# Step 1: check if all arguments are constant
- for arg in op.getarglist():
- self.optimizer.force_box(arg)
+ for i in range(start_index, op.numargs()):
+ self.optimizer.force_box(op.getarg(i))
# XXX hack to ensure that virtuals that are
# constant are presented that way
- result = self._can_optimize_call_pure(op)
+ result = self._can_optimize_call_pure(op, start_index=start_index)
if result is not None:
# this removes a CALL_PURE with all constant arguments.
self.make_constant(op, result)
@@ -168,26 +168,35 @@
# CALL_PURE.
for pos in self.call_pure_positions:
old_op = self.optimizer._newoperations[pos]
- if self.optimize_call_pure(op, old_op):
+ if self.optimize_call_pure_old(op, old_op):
return
if self.extra_call_pure:
for i, old_op in enumerate(self.extra_call_pure):
- if self.optimize_call_pure(op, old_op):
+ if self.optimize_call_pure_old(op, old_op):
if isinstance(old_op, PreambleOp):
old_op = self.optimizer.force_op_from_preamble(old_op)
self.extra_call_pure[i] = old_op
return
- # replace CALL_PURE with just CALL
- opnum = OpHelpers.call_for_descr(op.getdescr())
- newop = self.optimizer.replace_op_with(op, opnum)
+ # replace CALL_PURE with just CALL (but keep COND_CALL_VALUE)
+ if start_index == 0:
+ opnum = OpHelpers.call_for_descr(op.getdescr())
+ newop = self.optimizer.replace_op_with(op, opnum)
+ else:
+ newop = op
return self.emit_result(CallPureOptimizationResult(self, newop))
+ def optimize_CALL_PURE_I(self, op):
+ return self.optimize_call_pure(op)
optimize_CALL_PURE_R = optimize_CALL_PURE_I
optimize_CALL_PURE_F = optimize_CALL_PURE_I
optimize_CALL_PURE_N = optimize_CALL_PURE_I
- def optimize_call_pure(self, op, old_op):
+ def optimize_COND_CALL_VALUE_I(self, op):
+ return self.optimize_call_pure(op, start_index=1)
+ optimize_COND_CALL_VALUE_R = optimize_COND_CALL_VALUE_I
+
+ def optimize_call_pure_old(self, op, old_op):
if (op.numargs() != old_op.numargs() or
op.getdescr() is not old_op.getdescr()):
return False
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
@@ -611,7 +611,7 @@
self.last_emitted_operation = REMOVED
return
if info == INFO_NULL:
- opnum = OpHelpers.call_for_type(op.type)
+ opnum = OpHelpers.call_pure_for_type(op.type)
op = self.replace_op_with(op, opnum, args=op.getarglist()[1:])
return self.emit(op)
optimize_COND_CALL_VALUE_R = optimize_COND_CALL_VALUE_I
diff --git a/rpython/jit/metainterp/resoperation.py
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -1335,6 +1335,16 @@
return rop.CALL_N
@staticmethod
+ def call_pure_for_type(tp):
+ if tp == 'i':
+ return rop.CALL_PURE_I
+ elif tp == 'r':
+ return rop.CALL_PURE_R
+ elif tp == 'f':
+ return rop.CALL_PURE_F
+ return rop.CALL_PURE_N
+
+ @staticmethod
def is_guard(opnum):
return rop._GUARD_FIRST <= opnum <= rop._GUARD_LAST
diff --git a/rpython/jit/metainterp/test/test_call.py
b/rpython/jit/metainterp/test/test_call.py
--- a/rpython/jit/metainterp/test/test_call.py
+++ b/rpython/jit/metainterp/test/test_call.py
@@ -131,7 +131,7 @@
assert res == -1
# optimizer: the COND_CALL_VALUE is turned into a regular
# CALL_PURE, which itself becomes a CALL
- self.check_resops(call_pure_i=0, cond_call_pure_i=0, call_i=2,
+ self.check_resops(call_pure_i=0, cond_call_value_i=0, call_i=2,
int_sub=2)
def test_cond_call_constant_in_optimizer_3(self):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit