Author: Hakan Ardo <[email protected]>
Branch: jit-short_from_state
Changeset: r46400:080e6b76945d
Date: 2011-08-09 20:06 +0200
http://bitbucket.org/pypy/pypy/changeset/080e6b76945d/

Log:    treat cached constants produced by setfield_gc in the same way as
        cached constants produced by getfield_gc

diff --git a/pypy/jit/metainterp/optimizeopt/heap.py 
b/pypy/jit/metainterp/optimizeopt/heap.py
--- a/pypy/jit/metainterp/optimizeopt/heap.py
+++ b/pypy/jit/metainterp/optimizeopt/heap.py
@@ -136,7 +136,7 @@
                     result = op.getarg(1)
                     if isinstance(result, Const):
                         newresult = result.clonebox()
-                        shortboxes.alias(newresult, result)
+                        optimizer.make_constant(newresult, result)
                         result = newresult
                     getop = ResOperation(rop.GETFIELD_GC, [op.getarg(0)],
                                          result, op.getdescr())
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py 
b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -6916,13 +6916,13 @@
         i10 = getfield_gc(p5, descr=valuedescr)
         call(i10, descr=nonwritedescr) 
         setfield_gc(p5, 1, descr=valuedescr)
-        jump(p5, 1)
-        """
-        expected = """
-        [p5, i10]
-        call(i10, descr=nonwritedescr) 
+        jump(p5)
+        """
+        expected = """
+        [p5]
+        call(1, descr=nonwritedescr) 
         setfield_gc(p5, 1, descr=valuedescr)
-        jump(p5, 1)
+        jump(p5)
         """
         self.optimize_loop(ops, expected, preamble)
 
@@ -6944,6 +6944,61 @@
         """
         self.optimize_loop(ops, expected)
 
+    def test_specialized_to_cached_constant_guard(self):
+        ops = """
+        [p9]
+        i16 = getfield_gc(p9, descr=valuedescr)
+        i17 = int_is_true(i16)
+        guard_false(i17) []
+        call_assembler(i17, descr=asmdescr)
+        i18 = getfield_gc(p9, descr=valuedescr)
+        guard_value(i18, 0) []
+        jump(p9)
+        """
+        expected = """
+        [p9]
+        call_assembler(0, descr=asmdescr)
+        i18 = getfield_gc(p9, descr=valuedescr)
+        guard_value(i18, 0) []        
+        jump(p9)
+        """
+        self.optimize_loop(ops, expected)
+
+    def test_specialized_to_cached_constant_setfield(self):
+        ops = """
+        [p9]
+        i16 = getfield_gc(p9, descr=valuedescr)
+        i17 = int_is_true(i16)
+        guard_false(i17) []
+        call_assembler(i17, descr=asmdescr)
+        i18 = setfield_gc(p9, 0, descr=valuedescr)
+        jump(p9)
+        """
+        expected = """
+        [p9]
+        call_assembler(0, descr=asmdescr)
+        i18 = setfield_gc(p9, 0, descr=valuedescr)
+        jump(p9)
+        """
+        self.optimize_loop(ops, expected)
+
+    def test_cached_equal_fields(self):
+        ops = """
+        [p5, p6]
+        i10 = getfield_gc(p5, descr=valuedescr)
+        i11 = getfield_gc(p6, descr=nextdescr)
+        call(i10, i11, descr=nonwritedescr)
+        setfield_gc(p6, i10, descr=nextdescr)        
+        jump(p5, p6)
+        """
+        expected = """
+        [p5, p6, i10, i11]
+        call(i10, i11, descr=nonwritedescr)
+        setfield_gc(p6, i10, descr=nextdescr)        
+        jump(p5, p6, i10, i10)
+        """
+        self.optimize_loop(ops, expected)
+
 class TestLLtype(OptimizeOptTest, LLtypeMixin):
     pass
         
diff --git a/pypy/jit/metainterp/test/test_virtualstate.py 
b/pypy/jit/metainterp/test/test_virtualstate.py
--- a/pypy/jit/metainterp/test/test_virtualstate.py
+++ b/pypy/jit/metainterp/test/test_virtualstate.py
@@ -627,7 +627,8 @@
         [p0]
         guard_nonnull(p0) []
         i10 = getfield_gc(p0, descr=valuedescr)
-        jump(p0, i10)
+        guard_value(i10, 1) []
+        jump(p0)
         """
         self.optimize_bridge(loop, bridge, expected, p0=self.myptr)        
         bridge = """
@@ -638,10 +639,32 @@
         expected = """
         [p0]
         setfield_gc(p0, 7, descr=valuedescr)
-        jump(p0, 7)
+        jump(p0)
         """
-        self.optimize_bridge(loop, bridge, expected, p0=self.myptr)        
-        
+        self.optimize_bridge(loop, bridge, expected, 'Preamble', p0=self.myptr)
+
+    def test_cached_equal_fields(self):
+        loop = """
+        [p5, p6]
+        i10 = getfield_gc(p5, descr=valuedescr)
+        i11 = getfield_gc(p6, descr=nextdescr)
+        call(i10, i11, descr=nonwritedescr)
+        setfield_gc(p6, i10, descr=nextdescr)        
+        jump(p5, p6)
+        """
+        bridge = """
+        [p5, p6]
+        jump(p5, p6)
+        """
+        expected = """
+        [p5, p6]
+        guard_nonnull(p5) []
+        guard_nonnull(p6) []
+        i10 = getfield_gc(p5, descr=valuedescr)
+        i11 = getfield_gc(p6, descr=nextdescr)
+        jump(p5, p6, i10, i11)
+        """
+        self.optimize_bridge(loop, bridge, expected, p5=self.myptr, 
p6=self.myptr2)
 
 class TestLLtypeGuards(BaseTestGenerateGuards, LLtypeMixin):
     pass
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to