Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: share-guard-info
Changeset: r79741:070844031819
Date: 2015-09-21 17:22 +0200
http://bitbucket.org/pypy/pypy/changeset/070844031819/

Log:    checkin in-progress

diff --git a/rpython/jit/metainterp/blackhole.py 
b/rpython/jit/metainterp/blackhole.py
--- a/rpython/jit/metainterp/blackhole.py
+++ b/rpython/jit/metainterp/blackhole.py
@@ -1503,7 +1503,8 @@
         elif opnum == rop.GUARD_NO_OVERFLOW:
             # Produced by int_xxx_ovf().  The pc is just after the opcode.
             # We get here because it did not used to overflow, but now it does.
-            return get_llexception(self.cpu, OverflowError())
+            #return get_llexception(self.cpu, OverflowError())
+            pass
         #
         elif opnum == rop.GUARD_OVERFLOW:
             # Produced by int_xxx_ovf().  The pc is just after the opcode.
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
@@ -567,13 +567,15 @@
         self.metainterp_sd.profiler.count(jitprof.Counters.OPT_OPS)
         if op.is_guard():
             assert isinstance(op, GuardResOp)
-            if self.origin_jitcode is not None:
-                if (self.origin_jitcode is op.rd_frame_info_list.jitcode and
-                    self.origin_pc is op.rd_frame_info_list.pc):
-                    self.origin_jitcode = None
-                    self.origin_pc = 0
-                else:
-                    return # we optimize the guard
+            #if self.origin_jitcode is not None:
+            #    if (self.origin_jitcode is op.rd_frame_info_list.jitcode and
+            #        self.origin_pc is op.rd_frame_info_list.pc):
+            #        self.origin_jitcode = None
+            #        self.origin_pc = 0
+            #    else:
+            #        import pdb
+            #        pdb.set_trace()
+            #        return # we optimize the guard
             self.metainterp_sd.profiler.count(jitprof.Counters.OPT_GUARDS)
             pendingfields = self.pendingfields
             self.pendingfields = None
@@ -595,14 +597,13 @@
     def emit_guard_operation(self, op, pendingfields):
         guard_op = self.replace_op_with(op, op.getopnum())
         if (self._last_guard_op and guard_op.getdescr() is None and
-            guard_op.getopnum() != rop.GUARD_VALUE and
-            not guard_op.same_guard_position(self._last_guard_op)):
+            guard_op.getopnum() != rop.GUARD_VALUE):
             op = self._copy_resume_data_from(guard_op,
                                              self._last_guard_op)
         else:
             op = self.store_final_boxes_in_guard(guard_op, pendingfields)
-            if op.getopnum() not in (rop.GUARD_EXCEPTION, rop.GUARD_OVERFLOW):
-                self._last_guard_op = op
+            #if op.getopnum() not in (rop.GUARD_EXCEPTION, rop.GUARD_OVERFLOW):
+            self._last_guard_op = op
             # for unrolling
             for farg in op.getfailargs():
                 if farg:
diff --git a/rpython/jit/metainterp/pyjitpl.py 
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -230,13 +230,13 @@
 
     for _opimpl in ['int_add_ovf', 'int_sub_ovf', 'int_mul_ovf']:
         exec py.code.Source('''
-            @arguments("box", "box")
-            def opimpl_%s(self, b1, b2):
+            @arguments("box", "box", "orgpc")
+            def opimpl_%s(self, b1, b2, orgpc):
                 self.metainterp.clear_exception()
                 resbox = self.execute(rop.%s, b1, b2)
                 self.make_result_of_lastop(resbox)  # same as execute_varargs()
                 if not isinstance(resbox, Const):
-                    self.metainterp.handle_possible_overflow_error()
+                    self.metainterp.handle_possible_overflow_error(orgpc)
                 return resbox
         ''' % (_opimpl, _opimpl.upper())).compile()
 
@@ -418,7 +418,7 @@
                 assert box.getint() == 0
                 target = switchdict.dict[const1.getint()]
                 self.metainterp.generate_guard(rop.GUARD_FALSE, box,
-                                               resumepc=target)
+                                               resumepc=orgpc)
         else:
             # found one of the cases
             self.implement_guard_value(valuebox, orgpc)
@@ -2480,11 +2480,12 @@
             pass # XXX we want to do something special in resume descr,
                  # but not now
         elif opnum == rop.GUARD_NO_OVERFLOW:   # an overflow now detected
-            self.execute_raised(OverflowError(), constant=True)
-            try:
-                self.finishframe_exception()
-            except ChangeFrame:
-                pass
+            pass
+            #self.execute_raised(OverflowError(), constant=True)
+            #try:
+            #    self.finishframe_exception()
+            #except ChangeFrame:
+            #    pass
         elif opnum == rop.GUARD_OVERFLOW:      # no longer overflowing
             self.clear_exception()
         else:
@@ -2772,9 +2773,9 @@
         else:
             self.generate_guard(rop.GUARD_NO_EXCEPTION, None, [])
 
-    def handle_possible_overflow_error(self):
+    def handle_possible_overflow_error(self, orgpc):
         if self.last_exc_value:
-            op = self.generate_guard(rop.GUARD_OVERFLOW, None)
+            op = self.generate_guard(rop.GUARD_OVERFLOW, None, resumepc=orgpc)
             op.setref_base(lltype.cast_opaque_ptr(llmemory.GCREF,
                                                   self.last_exc_value))
             assert self.class_of_last_exc_is_const
@@ -2782,7 +2783,7 @@
                 lltype.cast_opaque_ptr(llmemory.GCREF, self.last_exc_value))
             self.finishframe_exception()
         else:
-            self.generate_guard(rop.GUARD_NO_OVERFLOW, None)
+            self.generate_guard(rop.GUARD_NO_OVERFLOW, None, resumepc=orgpc)
 
     def assert_no_exception(self):
         assert not self.last_exc_value
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
@@ -378,12 +378,6 @@
         newop.rd_frame_info_list = self.rd_frame_info_list
         return newop
 
-    def same_guard_position(self, other):
-        assert isinstance(other, GuardResOp)
-        frame_info1 = self.rd_frame_info_list
-        frame_info2 = other.rd_frame_info_list
-        return (frame_info1.jitcode is frame_info2.jitcode and
-                frame_info1.pc == frame_info2.pc)
 
 # ===========
 # type mixins
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
@@ -723,6 +723,7 @@
                 elif n == 7: a = 3
                 else:        a = 2
                 x = intmask(x * 10 + a)
+                #print "XXXXXXXXXXXXXXXX", x
                 i += 1
             return x
         res = self.meta_interp(f, [0], backendopt=True)
@@ -1866,7 +1867,8 @@
         res = self.meta_interp(g, [6, 20])
         assert res == g(6, 20)
         self.check_trace_count(8)
-        self.check_resops(getarrayitem_gc_i=10)
+        # 6 extra from sharing guard data
+        self.check_resops(getarrayitem_gc_i=10 + 6)
 
     def test_multiple_specialied_versions_bridge(self):
         myjitdriver = JitDriver(greens = [], reds = ['y', 'x', 'z', 'res'])
@@ -2055,8 +2057,8 @@
         res = self.meta_interp(g, [3, 23])
         assert res == 7068153
         self.check_trace_count(6)
-        self.check_resops(guard_true=6, guard_class=2, int_mul=3,
-                          int_add=3, guard_false=3)
+        self.check_resops(guard_true=8, guard_class=2, int_mul=3,
+                          int_add=3, guard_false=4)
 
     def test_dont_trace_every_iteration(self):
         myjitdriver = JitDriver(greens = [], reds = ['a', 'b', 'i', 'sa'])
@@ -2079,7 +2081,7 @@
         self.check_enter_count(2)
 
     def test_current_trace_length(self):
-        myjitdriver = JitDriver(greens = ['g'], reds = ['x'])
+        myjitdriver = JitDriver(greens = ['g'], reds = ['x', 'l'])
         @dont_look_inside
         def residual():
             print "hi there"
@@ -2090,14 +2092,15 @@
                 residual()
                 y += 1
         def f(x, g):
+            l = []
             n = 0
             while x > 0:
-                myjitdriver.can_enter_jit(x=x, g=g)
-                myjitdriver.jit_merge_point(x=x, g=g)
+                myjitdriver.can_enter_jit(x=x, g=g, l=l)
+                myjitdriver.jit_merge_point(x=x, g=g, l=l)
                 loop(g)
                 x -= 1
-                n = current_trace_length()
-            return n
+                l.append(current_trace_length())
+            return l[-2] # not the blackholed version
         res = self.meta_interp(f, [5, 8])
         assert 14 < res < 42
         res = self.meta_interp(f, [5, 2])
@@ -2638,7 +2641,7 @@
                 i += 1
             return sa
         assert self.meta_interp(f, [20]) == f(20)
-        self.check_resops(int_lt=4, int_le=0, int_ge=0, int_gt=2)
+        self.check_resops(int_lt=4, int_le=0, int_ge=0, int_gt=4)
 
     def test_intbounds_not_generalized1(self):
         myjitdriver = JitDriver(greens = [], reds = ['n', 'i', 'sa'])
@@ -2655,7 +2658,7 @@
                 i += 1
             return sa
         assert self.meta_interp(f, [20]) == f(20)
-        self.check_resops(int_lt=6, int_le=2, int_ge=4, int_gt=3)
+        self.check_resops(int_lt=6, int_le=2, int_ge=4, int_gt=5)
 
 
     def test_intbounds_not_generalized2(self):
@@ -2676,7 +2679,7 @@
                 i += 1
             return sa
         assert self.meta_interp(f, [20]) == f(20)
-        self.check_resops(int_lt=4, int_le=3, int_ge=3, int_gt=2)
+        self.check_resops(int_lt=4, int_le=3, int_ge=3, int_gt=4)
 
     def test_retrace_limit1(self):
         myjitdriver = JitDriver(greens = [], reds = ['n', 'i', 'sa', 'a'])
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to