Author: Maciej Fijalkowski <[email protected]>
Branch: share-guard-info
Changeset: r79798:30d0f05cdae5
Date: 2015-09-23 19:46 +0200
http://bitbucket.org/pypy/pypy/changeset/30d0f05cdae5/
Log: fix heap.py, but a huge blunder in check_history too, fixing tests
diff --git a/rpython/jit/metainterp/history.py
b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -540,6 +540,9 @@
def check_consistency_of_branch(operations, seen, check_descr=True):
"NOT_RPYTHON"
for num, op in enumerate(operations):
+ if op.is_ovf():
+ assert operations[num + 1].getopnum() in
(rop.GUARD_NO_OVERFLOW,
+ rop.GUARD_OVERFLOW)
for i in range(op.numargs()):
box = op.getarg(i)
if not isinstance(box, Const):
@@ -750,7 +753,6 @@
return tokens
def check_history(self, expected=None, **check):
- return
insns = {}
for op in self.operations:
opname = op.getopname()
diff --git a/rpython/jit/metainterp/optimizeopt/heap.py
b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -298,9 +298,18 @@
origin_pc == op.rd_frame_info_list.pc):
self.optimizer.origin_jitcode = None
self.optimizer.origin_pc = 0
+ elif op.getopnum() == rop.GUARD_NO_OVERFLOW:
+ if self.postponed_op:
+ # XXX is this always the case?
+ assert self.postponed_op.is_ovf()
+ newop = self.optimizer.replace_op_with_no_ovf(
+ self.postponed_op)
+ self.postponed_op = newop
+ else:
+ self.optimizer.potentially_change_ovf_op_to_no_ovf(op)
+ return # we optimize the guard
elif op.getopnum() != rop.GUARD_OVERFLOW:
- self.optimizer.potentially_change_ovf_op_to_no_ovf(op)
- return # we optimize the guard
+ return
self.emitting_operation(op)
self.emit_postponed_op()
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
@@ -616,15 +616,19 @@
op = self._newoperations[-1]
if not op.is_ovf():
return
+ newop = self.replace_op_with_no_ovf(op)
+ self._newoperations[-1] = newop
+
+ def replace_op_with_no_ovf(self, op):
if op.getopnum() == rop.INT_MUL_OVF:
- newop = self.replace_op_with(op, rop.INT_MUL)
+ return self.replace_op_with(op, rop.INT_MUL)
elif op.getopnum() == rop.INT_ADD_OVF:
- newop = self.replace_op_with(op, rop.INT_ADD)
+ return self.replace_op_with(op, rop.INT_ADD)
elif op.getopnum() == rop.INT_SUB_OVF:
- newop = self.replace_op_with(op, rop.INT_SUB)
+ return self.replace_op_with(op, rop.INT_SUB)
else:
assert False
- self._newoperations[-1] = newop
+
def _copy_resume_data_from(self, guard_op, last_guard_op):
if guard_op.getopnum() in (rop.GUARD_NO_EXCEPTION,
rop.GUARD_EXCEPTION):
diff --git a/rpython/jit/metainterp/test/test_ajit.py
b/rpython/jit/metainterp/test/test_ajit.py
--- a/rpython/jit/metainterp/test/test_ajit.py
+++ b/rpython/jit/metainterp/test/test_ajit.py
@@ -406,7 +406,7 @@
return externfn(n, n+1)
res = self.interp_operations(f, [6])
assert res == 42
- self.check_operations_history(int_add=1, int_mul=0, call=1,
guard_no_exception=0)
+ self.check_operations_history(int_add=1, int_mul=0, call_i=1,
guard_no_exception=0)
def test_residual_call_elidable(self):
def externfn(x, y):
@@ -419,7 +419,7 @@
assert res == 42
# CALL_PURE is not recorded in the history if all-constant args
self.check_operations_history(int_add=0, int_mul=0,
- call=0, call_pure_i=0)
+ call_i=0, call_pure_i=0)
def test_residual_call_elidable_1(self):
@elidable
@@ -431,7 +431,7 @@
assert res == 42
# CALL_PURE is recorded in the history if not-all-constant args
self.check_operations_history(int_add=1, int_mul=0,
- call=0, call_pure_i=1)
+ call_i=0, call_pure_i=1)
def test_residual_call_elidable_2(self):
myjitdriver = JitDriver(greens = [], reds = ['n'])
@@ -659,11 +659,11 @@
#
res = self.meta_interp(f, [3, 6], repeat=7, function_threshold=0)
assert res == 6 - 4 - 5
- self.check_history(call=0) # because the trace starts in the middle
+ self.check_history(call_n=0) # because the trace starts in the middle
#
res = self.meta_interp(f, [60, 84], repeat=7)
assert res == 84 - 61 - 62
- self.check_history(call=1) # because the trace starts immediately
+ self.check_history(call_n=1) # because the trace starts immediately
def test_unroll_one_loop_iteration(self):
def unroll(code):
@@ -685,11 +685,11 @@
res = self.meta_interp(f, [1, 4, 1], enable_opts="", inline=True)
assert res == f(1, 4, 1)
- self.check_history(call_assembler=0)
+ self.check_history(call_assembler_i=0)
res = self.meta_interp(f, [1, 4, 2], enable_opts="", inline=True)
assert res == f(1, 4, 2)
- self.check_history(call_assembler=1)
+ self.check_history(call_assembler_i=1)
def test_format(self):
def f(n):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit