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