Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: fast-slowpath
Changeset: r65626:840cbb52a15f
Date: 2013-07-24 21:21 +0200
http://bitbucket.org/pypy/pypy/changeset/840cbb52a15f/

Log:    a crucial optimizations

diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py 
b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -250,7 +250,7 @@
                 # This is only safe if the class of the guard_value matches the
                 # class of the guard_*_class, otherwise the intermediate ops 
might
                 # be executed with wrong classes.
-                previous_classbox = 
value.get_constant_class(self.optimizer.cpu)            
+                previous_classbox = 
value.get_constant_class(self.optimizer.cpu)
                 expected_classbox = 
self.optimizer.cpu.ts.cls_of_box(op.getarg(1))
                 assert previous_classbox is not None
                 assert expected_classbox is not None
@@ -343,6 +343,15 @@
         resvalue = self.getvalue(op.result)
         self.loop_invariant_results[key] = resvalue
 
+    def optimize_COND_CALL(self, op):
+        arg = op.getarg(0)
+        val = self.getvalue(arg)
+        if val.is_constant():
+            if val.box.same_constant(CONST_0):
+                return
+            op = op.copy_and_change(rop.CALL, args=op.getarglist()[1:])
+        self.emit_operation(op)
+
     def _optimize_nullness(self, op, box, expect_nonnull):
         value = self.getvalue(box)
         if value.is_nonnull():
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -54,7 +54,7 @@
             expected_short = self.parse(expected_short)
 
         preamble = self.unroll_and_optimize(loop, call_pure_results)
-        
+
         #
         print
         print "Preamble:"
@@ -219,7 +219,7 @@
         """
         self.optimize_loop(ops, expected)
 
-    def test_reverse_of_cast_2(self):        
+    def test_reverse_of_cast_2(self):
         ops = """
         [p0]
         i1 = cast_ptr_to_int(p0)
@@ -1290,7 +1290,7 @@
         p30 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p30, i28, descr=nextdescr)
         setfield_gc(p3, p30, descr=valuedescr)
-        p46 = same_as(p30) # This same_as should be killed by backend        
+        p46 = same_as(p30) # This same_as should be killed by backend
         jump(i29, p30, p3)
         """
         expected = """
@@ -2582,7 +2582,7 @@
         p2 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p2, p4, descr=nextdescr)
         setfield_gc(p1, p2, descr=nextdescr)
-        i101 = same_as(i4) 
+        i101 = same_as(i4)
         jump(p1, i2, i4, p4, i101)
         """
         expected = """
@@ -3440,7 +3440,7 @@
         setfield_gc(p1, i1, descr=valuedescr)
         i3 = call_assembler(i1, descr=asmdescr)
         setfield_gc(p1, i3, descr=valuedescr)
-        i143 = same_as(i3) # Should be killed by backend        
+        i143 = same_as(i3) # Should be killed by backend
         jump(p1, i4, i3)
         '''
         self.optimize_loop(ops, ops, preamble)
@@ -3551,7 +3551,7 @@
         escape(i2)
         i4 = call(123456, 4, i0, 6, descr=plaincalldescr)
         guard_no_exception() []
-        i155 = same_as(i4)        
+        i155 = same_as(i4)
         jump(i0, i4, i155)
         '''
         expected = '''
@@ -6000,7 +6000,7 @@
         [p1, i1, i2, i3]
         escape(i3)
         i4 = int_sub(i2, i1)
-        i5 = same_as(i4)        
+        i5 = same_as(i4)
         jump(p1, i1, i2, i4, i5)
         """
         expected = """
@@ -7258,7 +7258,7 @@
         [i0]
         i2 = int_lt(i0, 10)
         guard_true(i2) []
-        i1 = int_add(i0, 1)        
+        i1 = int_add(i0, 1)
         jump(i1)
         """
         self.optimize_loop(ops, expected)
@@ -7976,7 +7976,7 @@
         jump(i0, p0, i2)
         """
         self.optimize_loop(ops, expected)
-        
+
     def test_constant_failargs(self):
         ops = """
         [p1, i2, i3]
@@ -8057,7 +8057,7 @@
         jump()
         """
         self.optimize_loop(ops, expected)
-        
+
 
     def test_issue1080_infinitie_loop_simple(self):
         ops = """
@@ -8089,8 +8089,8 @@
     def test_licm_boxed_opaque_getitem(self):
         ops = """
         [p1]
-        p2 = getfield_gc(p1, descr=nextdescr) 
-        mark_opaque_ptr(p2)        
+        p2 = getfield_gc(p1, descr=nextdescr)
+        mark_opaque_ptr(p2)
         guard_class(p2,  ConstClass(node_vtable)) []
         i3 = getfield_gc(p2, descr=otherdescr)
         i4 = call(i3, descr=nonwritedescr)
@@ -8106,8 +8106,8 @@
     def test_licm_boxed_opaque_getitem_unknown_class(self):
         ops = """
         [p1]
-        p2 = getfield_gc(p1, descr=nextdescr) 
-        mark_opaque_ptr(p2)        
+        p2 = getfield_gc(p1, descr=nextdescr)
+        mark_opaque_ptr(p2)
         i3 = getfield_gc(p2, descr=otherdescr)
         i4 = call(i3, descr=nonwritedescr)
         jump(p1)
@@ -8123,7 +8123,7 @@
     def test_licm_unboxed_opaque_getitem(self):
         ops = """
         [p2]
-        mark_opaque_ptr(p2)        
+        mark_opaque_ptr(p2)
         guard_class(p2,  ConstClass(node_vtable)) []
         i3 = getfield_gc(p2, descr=otherdescr)
         i4 = call(i3, descr=nonwritedescr)
@@ -8139,22 +8139,20 @@
     def test_licm_unboxed_opaque_getitem_unknown_class(self):
         ops = """
         [p2]
-        mark_opaque_ptr(p2)        
+        mark_opaque_ptr(p2)
         i3 = getfield_gc(p2, descr=otherdescr)
         i4 = call(i3, descr=nonwritedescr)
         jump(p2)
         """
         expected = """
         [p2]
-        i3 = getfield_gc(p2, descr=otherdescr) 
+        i3 = getfield_gc(p2, descr=otherdescr)
         i4 = call(i3, descr=nonwritedescr)
         jump(p2)
         """
         self.optimize_loop(ops, expected)
 
-
-
-    def test_only_strengthen_guard_if_class_matches(self):
+    def test_only_strengthen_guard_if_class_matches_2(self):
         ops = """
         [p1]
         guard_class(p1, ConstClass(node_vtable2)) []
@@ -8164,6 +8162,30 @@
         self.raises(InvalidLoop, self.optimize_loop,
                        ops, ops)
 
+    def test_cond_call_with_a_constant(self):
+        ops = """
+        [p1]
+        cond_call(1, 123, p1, descr=plaincalldescr)
+        jump(p1)
+        """
+        expected = """
+        [p1]
+        call(123, p1, descr=plaincalldescr)
+        jump(p1)
+        """
+        self.optimize_loop(ops, expected)
+
+    def test_cond_call_with_a_constant_2(self):
+        ops = """
+        [p1]
+        cond_call(0, 123, p1, descr=plaincalldescr)
+        jump(p1)
+        """
+        expected = """
+        [p1]
+        jump(p1)
+        """
+        self.optimize_loop(ops, expected)
 
 class TestLLtype(OptimizeOptTest, LLtypeMixin):
     pass
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to