Author: Maciej Fijalkowski <[email protected]>
Branch: improve-consecutive-dict-lookups
Changeset: r70008:0fdf94cb8da0
Date: 2014-03-17 11:54 +0200
http://bitbucket.org/pypy/pypy/changeset/0fdf94cb8da0/

Log:    fix guard_exception and write a failing test

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
@@ -177,6 +177,7 @@
         self._remove_guard_not_invalidated = False
         self._seen_guard_not_invalidated = False
         self.postponed_op = None
+        self.remove_next_guard = False
 
     def force_at_end_of_preamble(self):
         self.cached_dict_reads.clear()
@@ -306,6 +307,7 @@
         try:
             res_v = d[args]
             self.optimizer.make_equal_to(op.result, res_v, True)
+            self.remove_next_guard = True
             res = True
         except KeyError:
             d[args] = res_v
@@ -313,6 +315,14 @@
         self.cached_dict_reads[descr] = d
         return res
 
+    def optimize_GUARD_NO_EXCEPTION(self, op):
+        if self.remove_next_guard:
+            self.remove_next_guard = False
+            return
+        self.emit_operation(op)
+
+    optimize_GUARD_EXCEPTION = optimize_GUARD_NO_EXCEPTION
+
     def force_from_effectinfo(self, effectinfo):
         # XXX we can get the wrong complexity here, if the lists
         # XXX stored on effectinfo are large
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -5434,6 +5434,21 @@
         """
         self.optimize_loop(ops, expected)
 
+    def test_consecutive_getinteriorfields(self):
+        py.test.skip("we want this to pass")
+        ops = """
+        [p0, i0]
+        i1 = getinteriorfield_gc(p0, i0, descr=valuedescr)
+        i2 = getinteriorfield_gc(p0, i0, descr=valuedescr)
+        jump(i1, i2)
+        """
+        expected = """
+        [p0, i0]
+        i1 = getinteriorfield_gc(p0, i0, descr=valuedescr)
+        jump(i1, i1)
+        """
+        self.optimize_loop(ops, expected)
+
 
 class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
     pass
diff --git a/rpython/jit/metainterp/test/test_dict.py 
b/rpython/jit/metainterp/test/test_dict.py
--- a/rpython/jit/metainterp/test/test_dict.py
+++ b/rpython/jit/metainterp/test/test_dict.py
@@ -208,6 +208,8 @@
             return s
 
         self.meta_interp(f, [10])
+        self.check_simple_loop(call=1, getinteriorfield_gc=1,
+                               guard_no_exception=1)
 
 class TestLLtype(DictTests, LLJitMixin):
     pass
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to