Author: Richard Plangger <[email protected]>
Branch: vecopt-merge
Changeset: r80037:68cd8c5a751e
Date: 2015-10-08 10:11 +0200
http://bitbucket.org/pypy/pypy/changeset/68cd8c5a751e/
Log: quick fix for the guard exit, the first argument is unpacked, added
a test to check if this leads to a wrong result
diff --git a/rpython/jit/metainterp/compile.py
b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -759,8 +759,7 @@
index)
elif typetag == self.TY_REF:
refval = metainterp_sd.cpu.get_value_direct(deadframe, 'r',
- elif typetag == self.TY_REF:
- refval = metainterp_sd.cpu.get_ref_value(deadframe, index)
+ index)
intval = lltype.cast_ptr_to_int(refval)
elif typetag == self.TY_FLOAT:
floatval = metainterp_sd.cpu.get_value_direct(deadframe, 'f',
@@ -912,6 +911,25 @@
ptr = cpu.ts.cast_to_baseclass(gcref)
return cast_base_ptr_to_instance(AllVirtuals, ptr)
+def invent_fail_descr_for_op(opnum, optimizer, copied_guard=False):
+ if opnum == rop.GUARD_NOT_FORCED or opnum == rop.GUARD_NOT_FORCED_2:
+ assert not copied_guard
+ resumedescr = ResumeGuardForcedDescr()
+ resumedescr._init(optimizer.metainterp_sd, optimizer.jitdriver_sd)
+ elif opnum in (rop.GUARD_IS_OBJECT, rop.GUARD_SUBCLASS, rop.GUARD_GC_TYPE):
+ # note - this only happens in tests
+ resumedescr = ResumeAtPositionDescr()
+ elif opnum in (rop.GUARD_EXCEPTION, rop.GUARD_NO_EXCEPTION):
+ if copied_guard:
+ resumedescr = ResumeGuardCopiedExcDescr()
+ else:
+ resumedescr = ResumeGuardExcDescr()
+ else:
+ if copied_guard:
+ resumedescr = ResumeGuardCopiedDescr()
+ else:
+ resumedescr = ResumeGuardDescr()
+ return resumedescr
class ResumeGuardForcedDescr(ResumeGuardDescr):
def _init(self, metainterp_sd, jitdriver_sd):
diff --git a/rpython/jit/metainterp/optimizeopt/dependency.py
b/rpython/jit/metainterp/optimizeopt/dependency.py
--- a/rpython/jit/metainterp/optimizeopt/dependency.py
+++ b/rpython/jit/metainterp/optimizeopt/dependency.py
@@ -542,7 +542,7 @@
def __init__(self, loop):
self.loop = loop
self.label = Node(loop.label, 0)
- self.nodes = [ Node(op,i+1) for i,op in enumerate(loop.operations) if
not op.is_debug() ]
+ self.nodes = [ Node(op,i+1) for i,op in enumerate(loop.operations) if
not op.is_jit_debug() ]
self.inodes = [] # imaginary nodes
self.jump = Node(loop.jump, len(self.nodes)+1)
self.invariant_vars = {}
diff --git a/rpython/jit/metainterp/optimizeopt/schedule.py
b/rpython/jit/metainterp/optimizeopt/schedule.py
--- a/rpython/jit/metainterp/optimizeopt/schedule.py
+++ b/rpython/jit/metainterp/optimizeopt/schedule.py
@@ -390,17 +390,14 @@
prepare_arguments(state, pack, args)
vecop = VecOperation(left.vector, args, left,
pack.numops(), left.getdescr())
+ if left.is_guard():
+ prepare_fail_arguments(state, pack, left, vecop)
state.oplist.append(vecop)
for i,node in enumerate(pack.operations):
op = node.getoperation()
state.setvector_of_box(op,i,vecop)
if pack.is_accumulating():
state.renamer.start_renaming(op, vecop)
- if left.is_guard():
- assert isinstance(left, GuardResOp)
- assert isinstance(vecop, GuardResOp)
- vecop.setfailargs(left.getfailargs())
- vecop.rd_snapshot = left.rd_snapshot
def prepare_arguments(state, pack, args):
# Transforming one argument to a vector box argument
@@ -439,6 +436,20 @@
position_values(state, restrict, pack, args, i, pos) # d)
restrict.check(args[i])
+def prepare_fail_arguments(state, pack, left, vecop):
+ assert isinstance(left, GuardResOp)
+ assert isinstance(vecop, GuardResOp)
+ args = left.getfailargs()
+ for i, arg in enumerate(args):
+ pos, newarg = state.getvector_of_box(arg)
+ if newarg is None:
+ newarg = arg
+ if newarg.is_vector(): # can be moved to guard exit!
+ newarg = unpack_from_vector(state, newarg, 0, 1)
+ args[i] = newarg
+ vecop.setfailargs(args)
+ vecop.rd_snapshot = left.rd_snapshot
+
@always_inline
def crop_vector(state, oprestrict, restrict, pack, args, i):
# convert size i64 -> i32, i32 -> i64, ...
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
b/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
@@ -12,7 +12,6 @@
from rpython.rtyper.lltypesystem import rffi
from rpython.rtyper.lltypesystem import lltype
from rpython.conftest import option
-from rpython.jit.metainterp.compile import invent_fail_descr_for_op
class FakeDependencyGraph(DependencyGraph):
""" A dependency graph that is able to emit every instruction
@@ -46,9 +45,6 @@
def parse_loop(self, ops, add_label=True):
loop = self.parse(ops, postprocess=self.postprocess)
loop.operations = filter(lambda op: op.getopnum() !=
rop.DEBUG_MERGE_POINT, loop.operations)
- #for op in loop.operations:
- # if op.is_guard() and op.getdescr() is None:
- # op.setdescr(invent_fail_descr_for_op(op.opnum, None))
token = JitCellToken()
if add_label:
label = ResOperation(rop.LABEL, loop.inputargs,
descr=TargetToken(token))
diff --git a/rpython/jit/metainterp/optimizeopt/vector.py
b/rpython/jit/metainterp/optimizeopt/vector.py
--- a/rpython/jit/metainterp/optimizeopt/vector.py
+++ b/rpython/jit/metainterp/optimizeopt/vector.py
@@ -11,8 +11,7 @@
from rpython.jit.metainterp.resume import Snapshot
from rpython.jit.metainterp.jitexc import NotAVectorizeableLoop,
NotAProfitableLoop
#from rpython.jit.metainterp.optimizeopt.unroll import optimize_unroll
-from rpython.jit.metainterp.compile import (CompileLoopVersionDescr,
- invent_fail_descr_for_op, ResumeGuardDescr)
+from rpython.jit.metainterp.compile import (CompileLoopVersionDescr,
ResumeGuardDescr)
from rpython.jit.metainterp.history import (INT, FLOAT, VECTOR, ConstInt,
ConstFloat,
TargetToken, JitCellToken, AbstractFailDescr)
from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer,
Optimization
@@ -161,7 +160,7 @@
guard_count = 0
at_least_one_array_access = True
for i,op in enumerate(loop.operations):
- if op.is_debug():
+ if op.is_jit_debug():
continue
if op.vector >= 0 and not op.is_guard():
diff --git a/rpython/jit/metainterp/test/test_vector.py
b/rpython/jit/metainterp/test/test_vector.py
--- a/rpython/jit/metainterp/test/test_vector.py
+++ b/rpython/jit/metainterp/test/test_vector.py
@@ -166,6 +166,9 @@
(rffi.DOUBLE, lambda x: x == 0.0, 1.0, 0.0, 33,34, True),
(rffi.DOUBLE, lambda x: x == 0.0, 1.0, 0.1, 4,34, False),
(lltype.Signed, lambda x: not bool(x), 1, None, -1,32, False),
+ (lltype.Signed, lambda x: not bool(x), 1, 0, 14,32, True),
+ (lltype.Signed, lambda x: not bool(x), 1, 0, 15,31, True),
+ (lltype.Signed, lambda x: not bool(x), 1, 0, 16,30, True),
(lltype.Signed, lambda x: x == 0, 1, None, -1,33, False),
(lltype.Signed, lambda x: x == 0, 1, 0, 33,34, True),
# any
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit