Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r74937:5f24f3b47ef4
Date: 2014-12-14 21:38 +0200
http://bitbucket.org/pypy/pypy/changeset/5f24f3b47ef4/
Log: Start porting the tests bit by bit, 10% of optimizeopt passes
diff --git a/rpython/jit/metainterp/history.py
b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -94,15 +94,9 @@
raise NotImplementedError
getref._annspecialcase_ = 'specialize:arg(1)'
- def clonebox(self):
- raise NotImplementedError
-
def constbox(self):
raise NotImplementedError
- def nonconstbox(self):
- raise NotImplementedError
-
def getaddr(self):
"Only for raw addresses (BoxInt & ConstInt), not for GC addresses"
raise NotImplementedError
@@ -235,11 +229,6 @@
assert isinstance(value, Symbolic)
self.value = value
- def clonebox(self):
- return BoxInt(self.value)
-
- nonconstbox = clonebox
-
def getint(self):
return self.value
@@ -277,11 +266,6 @@
assert lltype.typeOf(valuestorage) is longlong.FLOATSTORAGE
self.value = valuestorage
- def clonebox(self):
- return BoxFloat(self.value)
-
- nonconstbox = clonebox
-
def getfloatstorage(self):
return self.value
@@ -324,11 +308,6 @@
assert lltype.typeOf(value) == llmemory.GCREF
self.value = value
- def clonebox(self):
- return BoxPtr(self.value)
-
- nonconstbox = clonebox
-
def getref_base(self):
return self.value
@@ -435,9 +414,6 @@
def forget_value(self):
self.value = 0
- def clonebox(self):
- return BoxInt(self.value)
-
def constbox(self):
return ConstInt(self.value)
@@ -471,9 +447,6 @@
def forget_value(self):
self.value = longlong.ZEROF
- def clonebox(self):
- return BoxFloat(self.value)
-
def constbox(self):
return ConstFloat(self.value)
@@ -504,9 +477,6 @@
def forget_value(self):
self.value = lltype.nullptr(llmemory.GCREF.TO)
- def clonebox(self):
- return BoxPtr(self.value)
-
def constbox(self):
return ConstPtr(self.value)
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
@@ -145,12 +145,12 @@
if structvalue in self._cached_fields:
if op.getopnum() == rop.SETFIELD_GC:
result = op.getarg(1)
+ opnum = OpHelpers.getfield_for_descr(op.getdescr())
+ getop = ResOperation(opnum, [op.getarg(0)],
+ op.getdescr())
+ getop.is_source_op = True
if isinstance(result, Const):
- newresult = result.clonebox()
- optimizer.make_constant(newresult, result)
- result = newresult
- getop = ResOperation(rop.GETFIELD_GC, [op.getarg(0)],
- result, op.getdescr())
+ optimizer.make_constant(getop, result)
shortboxes.add_potential(getop, synthetic=True)
if op.getopnum() == rop.SETARRAYITEM_GC:
result = op.getarg(2)
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
@@ -543,14 +543,14 @@
def test_ooisnull_on_null_ptr_1(self):
ops = """
[]
- p0 = escape()
+ p0 = escape_r()
guard_isnull(p0) []
guard_isnull(p0) []
jump()
"""
expected = """
[]
- p0 = escape()
+ p0 = escape_r()
guard_isnull(p0) []
jump()
"""
@@ -562,7 +562,7 @@
pv = new_with_vtable(ConstClass(node_vtable))
setfield_gc(pv, p0, descr=valuedescr)
guard_nonnull(p0) []
- p1 = getfield_gc(pv, descr=valuedescr)
+ p1 = getfield_gc_r(pv, descr=valuedescr)
guard_nonnull(p1) []
jump(p0)
"""
@@ -641,13 +641,13 @@
i3 = ptr_eq(NULL, p0)
guard_false(i3) []
guard_nonnull(p0) []
- escape(p0)
+ escape_r(p0)
jump()
"""
expected = """
[]
p0 = new_array(5, descr=arraydescr)
- escape(p0)
+ escape_r(p0)
jump()
"""
self.optimize_loop(ops, expected)
@@ -668,7 +668,7 @@
def test_constptr_guard_value(self):
ops = """
[]
- p1 = escape()
+ p1 = escape_r()
guard_value(p1, ConstPtr(myptr)) []
jump()
"""
@@ -755,7 +755,7 @@
def test_compare_with_itself(self):
ops = """
[]
- i0 = escape()
+ i0 = escape_i()
i1 = int_lt(i0, i0)
guard_false(i1) []
i2 = int_le(i0, i0)
@@ -772,7 +772,7 @@
"""
expected = """
[]
- i0 = escape()
+ i0 = escape_i()
jump()
"""
self.optimize_loop(ops, expected)
@@ -802,22 +802,22 @@
def test_p123_simple(self):
ops = """
[i1, p2, p3]
- i3 = getfield_gc(p3, descr=valuedescr)
- escape(i3)
+ i3 = getfield_gc_i(p3, descr=valuedescr)
+ escape_n(i3)
p1 = new_with_vtable(ConstClass(node_vtable))
setfield_gc(p1, i1, descr=valuedescr)
jump(i1, p1, p2)
"""
preamble = """
[i1, p2, p3]
- i3 = getfield_gc(p3, descr=valuedescr)
- escape(i3)
+ i3 = getfield_gc_i(p3, descr=valuedescr)
+ escape_n(i3)
jump(i1, p2)
"""
expected = """
[i1, p2]
- i3 = getfield_gc(p2, descr=valuedescr)
- escape(i3)
+ i3 = getfield_gc_i(p2, descr=valuedescr)
+ escape_n(i3)
p3 = new_with_vtable(ConstClass(node_vtable))
setfield_gc(p3, i1, descr=valuedescr)
jump(i1, p3)
@@ -828,8 +828,8 @@
def test_p123_nested(self):
ops = """
[i1, p2, p3]
- i3 = getfield_gc(p3, descr=valuedescr)
- escape(i3)
+ i3 = getfield_gc_i(p3, descr=valuedescr)
+ escape_n(i3)
p1 = new_with_vtable(ConstClass(node_vtable))
setfield_gc(p1, i1, descr=valuedescr)
p1sub = new_with_vtable(ConstClass(node_vtable2))
@@ -841,14 +841,14 @@
# virtual.
preamble = """
[i1, p2, p3]
- i3 = getfield_gc(p3, descr=valuedescr)
- escape(i3)
+ i3 = getfield_gc_i(p3, descr=valuedescr)
+ escape_n(i3)
jump(i1, p2)
"""
expected = """
[i1, p2]
- i3 = getfield_gc(p2, descr=valuedescr)
- escape(i3)
+ i3 = getfield_gc_i(p2, descr=valuedescr)
+ escape_n(i3)
p4 = new_with_vtable(ConstClass(node_vtable))
p1sub = new_with_vtable(ConstClass(node_vtable2))
setfield_gc(p1sub, i1, descr=valuedescr)
@@ -861,9 +861,9 @@
def test_p123_anti_nested(self):
ops = """
[i1, p2, p3]
- p3sub = getfield_gc(p3, descr=nextdescr)
- i3 = getfield_gc(p3sub, descr=valuedescr)
- escape(i3)
+ p3sub = getfield_gc_r(p3, descr=nextdescr)
+ i3 = getfield_gc_i(p3sub, descr=valuedescr)
+ escape_n(i3)
p1 = new_with_vtable(ConstClass(node_vtable))
p2sub = new_with_vtable(ConstClass(node_vtable2))
setfield_gc(p2sub, i1, descr=valuedescr)
@@ -874,9 +874,9 @@
# a "young" virtual p2sub. Make sure it is all forced.
preamble = """
[i1, p2, p3]
- p3sub = getfield_gc(p3, descr=nextdescr)
- i3 = getfield_gc(p3sub, descr=valuedescr)
- escape(i3)
+ p3sub = getfield_gc_r(p3, descr=nextdescr)
+ i3 = getfield_gc_i(p3sub, descr=valuedescr)
+ escape_n(i3)
p2sub = new_with_vtable(ConstClass(node_vtable2))
setfield_gc(p2sub, i1, descr=valuedescr)
setfield_gc(p2, p2sub, descr=nextdescr)
@@ -884,8 +884,8 @@
"""
expected = """
[i1, p2, p2sub]
- i3 = getfield_gc(p2sub, descr=valuedescr)
- escape(i3)
+ i3 = getfield_gc_i(p2sub, descr=valuedescr)
+ escape_n(i3)
p1 = new_with_vtable(ConstClass(node_vtable))
p3sub = new_with_vtable(ConstClass(node_vtable2))
setfield_gc(p3sub, i1, descr=valuedescr)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -385,7 +385,7 @@
assert len(optimized.inputargs) == len(expected.inputargs)
remap = {}
for box1, box2 in zip(optimized.inputargs, expected.inputargs):
- assert box1.__class__ == box2.__class__
+ assert box1.type == box2.type
remap[box2] = box1
assert equaloplists(optimized.operations,
expected.operations, False, remap, text_right)
@@ -419,7 +419,7 @@
jump_args = jumpop.getarglist()[:]
operations = operations[:-1]
- memo = compile.Memo()
+ memo = compile.Memo(inputargs, jump_args)
cloned_operations = [op.clone(memo) for op in operations]
for op in cloned_operations:
op.is_source_op = True
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -280,7 +280,7 @@
# We dont need to inline the short preamble we are creating as we are
conneting
# the bridge to a different trace with a different short preamble
- self.short_inliner = None
+ self.memo = None
newoperations = self.optimizer.get_newoperations()
self.boxes_created_this_iteration = {}
@@ -384,13 +384,14 @@
assert isinstance(target_token, TargetToken)
# Turn guards into conditional jumps to the preamble
- for i in range(len(short)):
- op = short[i]
- if op.is_guard():
- #op = op.clone() XXXX
- op.setfailargs(None)
- op.setdescr(None) # will be set to a proper descr when the
preamble is used
- short[i] = op
+ #for i in range(len(short)):
+ # op = short[i]
+ # if op.is_guard():
+ #op = op.clone(self.memo)
+ #op.is_source_op = True
+ # op.setfailargs(None)
+ # op.setdescr(None) # will be set to a proper descr when the
preamble is used
+ # short[i] = op
# Clone ops and boxes to get private versions and
short_inputargs = short[0].getarglist()
@@ -408,7 +409,10 @@
for i in range(len(short)):
op = short[i]
newop = op.clone(memo)
- if op.type != 'v' and op in self.short_boxes.assumed_classes:
+ if newop.is_guard():
+ newop.setfailargs(None)
+ newop.setdescr(None)
+ if op in self.short_boxes.assumed_classes:
target_token.assumed_classes[newop] =
self.short_boxes.assumed_classes[op]
short[i] = newop
@@ -443,8 +447,8 @@
if op is None:
return None
if op is not None and op in self.short_seen:
- if emit and self.short_inliner:
- return self.short_inliner.inline_arg(op.result)
+ if emit and self.memo:
+ return self.memo.get(op, op)
else:
return None
@@ -487,7 +491,7 @@
short_op = self.short_boxes.producer(box)
newresult = self.add_op_to_short(short_op)
- short_jumpargs.append(short_op.result)
+ short_jumpargs.append(short_op)
inputargs.append(box)
box = newresult
if box in self.optimizer.values:
diff --git a/rpython/jit/metainterp/resoperation.py
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -161,7 +161,12 @@
['descr=%r' % descr]))
def repr_short(self, memo):
- return memo[self]
+ try:
+ return memo[self]
+ except KeyError:
+ name = self.type + str(len(memo))
+ memo[self] = name
+ return name
def getopname(self):
try:
@@ -327,6 +332,9 @@
def nonnull(self):
return self._resint != 0
+ def clone_input_arg(self):
+ return InputArgInt()
+
class FloatOp(object):
_mixin_ = True
@@ -349,6 +357,9 @@
def nonnull(self):
return bool(longlong.extract_bits(self._resfloat))
+ def clone_input_arg(self):
+ return InputArgFloat()
+
class RefOp(object):
_mixin_ = True
@@ -373,6 +384,9 @@
def nonnull(self):
return bool(self._resref)
+ def clone_input_arg(self):
+ return InputArgRef()
+
class AbstractInputArg(AbstractValue):
is_source_op = True
source_op = None
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit