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

Reply via email to