Author: Maciej Fijalkowski <[email protected]>
Branch: result-in-resops
Changeset: r57572:14b640a43274
Date: 2012-09-25 14:16 +0200
http://bitbucket.org/pypy/pypy/changeset/14b640a43274/

Log:    bring back interning of constant refs. fix some tests

diff --git a/TODO b/TODO
--- a/TODO
+++ b/TODO
@@ -1,2 +1,5 @@
 
 * make OptValue somehow leaner using subclassing instead of one-size-fit-most
+
+* rethink interning vs other ideas of caching for getinterned on optimizer
+  and cache fields
\ No newline at end of file
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
@@ -371,7 +371,7 @@
         cf = self.field_cache(op.getdescr())
         fieldvalue = cf.getfield_from_cache(self, structvalue)
         if fieldvalue is not None:
-            self.make_equal_to(op.result, fieldvalue)
+            self.replace(op, fieldvalue.op)
             return
         # default case: produce the operation
         structvalue.ensure_nonnull()
diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py 
b/pypy/jit/metainterp/optimizeopt/intbounds.py
--- a/pypy/jit/metainterp/optimizeopt/intbounds.py
+++ b/pypy/jit/metainterp/optimizeopt/intbounds.py
@@ -170,9 +170,9 @@
             # Else, synthesize the non overflowing op for optimize_default to
             # reuse, as well as the reverse op
             elif opnum == rop.INT_ADD_OVF:
-                self.pure(rop.INT_ADD, args[:], result)
-                self.pure(rop.INT_SUB, [result, args[1]], args[0])
-                self.pure(rop.INT_SUB, [result, args[0]], args[1])
+                self.pure(rop.INT_ADD, result.getint(), args[0], args[1])
+                self.pure(rop.INT_SUB, args[0].getint(), result, args[1])
+                self.pure(rop.INT_SUB, args[1].getint(), result, args[0])
             elif opnum == rop.INT_SUB_OVF:
                 self.pure(rop.INT_SUB, args[:], result)
                 self.pure(rop.INT_ADD, [result, args[1]], args[0])
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py 
b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -260,7 +260,7 @@
         self.make_constant(box)
 
     def __repr__(self):
-        return 'Constant(%r)' % (self.box,)
+        return 'Constant(%r)' % (self.op,)
 
 CONST_0      = ConstInt(0)
 CONST_1      = ConstInt(1)
@@ -361,7 +361,6 @@
         self.cpu = metainterp_sd.cpu
         self.loop = loop
         self.interned_refs = self.cpu.ts.new_ref_dict()
-        self.interned_ints = {}
         self.resumedata_memo = resume.ResumeDataLoopMemo(metainterp_sd)
         self.pendingfields = []
         self.quasi_immutable_deps = None
@@ -423,25 +422,16 @@
         self.metainterp_sd.profiler.count(jitprof.Counters.OPT_FORCINGS)
         self.resumedata_memo.forget_numberings(virtualbox)
 
-    def getinterned(self, box):
-        # WTF is this function doing?
-        if box.type != REF:
-            return box
-        constbox = self.get_constant_box(box)
-        if constbox is None:
-            return box
-        value = constbox.getref_base()
-        if not value:
-            return box
-        return self.interned_refs.setdefault(value, box)
-        #elif constbox.type == INT:
-        #    value = constbox.getint()
-        #    return self.interned_ints.setdefault(value, box)
-
     def getvalue(self, box):
         if box.is_constant():
+            if box.type == REF:
+                try:
+                    return self.interned_refs[box.getref_base()]
+                except KeyError:
+                    val = ConstantValue(box)
+                    self.interned_refs[box.getref_base()] = val
+                    return val
             return ConstantValue(box)
-        box = self.getinterned(box)
         try:
             value = box.get_extra("optimize_value")
         except KeyError:
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py 
b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -1299,7 +1299,7 @@
     def test_vstruct_1(self):
         ops = """
         [i1, p2]
-        i2 = getfield_gc(p2, descr=adescr)
+        i2 = getfield_gc_i(p2, descr=adescr)
         escape(i2)
         p3 = new(descr=ssize)
         setfield_gc(p3, i1, descr=adescr)
@@ -1316,7 +1316,7 @@
     def test_p123_vstruct(self):
         ops = """
         [i1, p2, p3]
-        i3 = getfield_gc(p3, descr=adescr)
+        i3 = getfield_gc_i(p3, descr=adescr)
         escape(i3)
         p1 = new(descr=ssize)
         setfield_gc(p1, i1, descr=adescr)
@@ -1328,10 +1328,10 @@
     def test_duplicate_getfield_1(self):
         ops = """
         [p1, p2]
-        i1 = getfield_gc(p1, descr=valuedescr)
-        i2 = getfield_gc(p2, descr=valuedescr)
-        i3 = getfield_gc(p1, descr=valuedescr)
-        i4 = getfield_gc(p2, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p2, descr=valuedescr)
+        i3 = getfield_gc_i(p1, descr=valuedescr)
+        i4 = getfield_gc_i(p2, descr=valuedescr)
         escape(i1)
         escape(i2)
         escape(i3)
@@ -1340,8 +1340,8 @@
         """
         expected = """
         [p1, p2]
-        i1 = getfield_gc(p1, descr=valuedescr)
-        i2 = getfield_gc(p2, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p2, descr=valuedescr)
         escape(i1)
         escape(i2)
         escape(i1)
@@ -1354,7 +1354,7 @@
         ops = """
         [p1, i1]
         setfield_gc(p1, i1, descr=valuedescr)
-        i2 = getfield_gc(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p1, descr=valuedescr)
         escape(i2)
         jump(p1, i1)
         """
@@ -1371,7 +1371,7 @@
         [p1, p2, i1]
         setfield_gc(p1, i1, descr=valuedescr)
         setfield_gc(p2, p1, descr=nextdescr)
-        i2 = getfield_gc(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p1, descr=valuedescr)
         escape(i2)
         jump(p1, p2, i1)
         """
@@ -1389,7 +1389,7 @@
         [p1, p2, i1, i2]
         setfield_gc(p1, i1, descr=valuedescr)
         setfield_gc(p2, i2, descr=valuedescr)
-        i3 = getfield_gc(p1, descr=valuedescr)
+        i3 = getfield_gc_i(p1, descr=valuedescr)
         escape(i3)
         jump(p1, p2, i1, i3)
         """
@@ -1398,16 +1398,16 @@
     def test_duplicate_getfield_mergepoint_has_no_side_effects(self):
         ops = """
         [p1]
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         debug_merge_point(15, 0)
-        i2 = getfield_gc(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p1, descr=valuedescr)
         escape(i1)
         escape(i2)
         jump(p1)
         """
         expected = """
         [p1]
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         debug_merge_point(15, 0)
         escape(i1)
         escape(i1)
@@ -1418,17 +1418,17 @@
     def test_duplicate_getfield_ovf_op_does_not_clear(self):
         ops = """
         [p1]
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         i2 = int_add_ovf(i1, 14)
         guard_no_overflow() []
-        i3 = getfield_gc(p1, descr=valuedescr)
+        i3 = getfield_gc_i(p1, descr=valuedescr)
         escape(i2)
         escape(i3)
         jump(p1)
         """
         expected = """
         [p1]
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         i2 = int_add_ovf(i1, 14)
         guard_no_overflow() []
         escape(i2)
@@ -1440,16 +1440,16 @@
     def test_duplicate_getfield_setarrayitem_does_not_clear(self):
         ops = """
         [p1, p2]
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         setarrayitem_gc(p2, 0, p1, descr=arraydescr2)
-        i3 = getfield_gc(p1, descr=valuedescr)
+        i3 = getfield_gc_i(p1, descr=valuedescr)
         escape(i1)
         escape(i3)
         jump(p1, p2)
         """
         expected = """
         [p1, p2]
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         setarrayitem_gc(p2, 0, p1, descr=arraydescr2)
         escape(i1)
         escape(i1)
@@ -1460,15 +1460,15 @@
     def test_duplicate_getfield_constant(self):
         ops = """
         []
-        i1 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
-        i2 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
+        i1 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
+        i2 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
         escape(i1)
         escape(i2)
         jump()
         """
         expected = """
         []
-        i1 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
+        i1 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
         escape(i1)
         escape(i1)
         jump()
@@ -1479,15 +1479,15 @@
         ops = """
         [p1]
         guard_value(p1, ConstPtr(myptr)) []
-        i1 = getfield_gc(p1, descr=valuedescr)
-        i2 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
+        i2 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
         escape(i1)
         escape(i2)
         jump(p1)
         """
         expected = """
         []
-        i1 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
+        i1 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
         escape(i1)
         escape(i1)
         jump()
@@ -1498,9 +1498,9 @@
     def test_duplicate_getfield_sideeffects_1(self):
         ops = """
         [p1]
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         escape()
-        i2 = getfield_gc(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p1, descr=valuedescr)
         escape(i1)
         escape(i2)
         jump(p1)
diff --git a/pypy/jit/metainterp/optimizeopt/virtualize.py 
b/pypy/jit/metainterp/optimizeopt/virtualize.py
--- a/pypy/jit/metainterp/optimizeopt/virtualize.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualize.py
@@ -376,9 +376,9 @@
         self.setvalue(op, vvalue)
         return vvalue
 
-    def make_vstruct(self, structdescr, box, source_op=None):
-        vvalue = VStructValue(self.optimizer.cpu, structdescr, box, source_op)
-        self.make_equal_to(box, vvalue)
+    def make_vstruct(self, structdescr, op):
+        vvalue = VStructValue(self.optimizer.cpu, structdescr, op)
+        self.setvalue(op, vvalue)
         return vvalue
 
     def optimize_VIRTUAL_REF(self, op):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to