Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79364:587467d78277
Date: 2015-09-01 21:14 +0200
http://bitbucket.org/pypy/pypy/changeset/587467d78277/
Log: hack sliiightly differently
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
@@ -100,6 +100,9 @@
# need any _lazy_setfield: the heap value is already right.
# Note that this may reset to None a non-None lazy_setfield,
# cancelling its previous effects with no side effect.
+
+ # Now, we have to force the item in the short preamble
+ self._getfield(structinfo, op.getdescr(), optheap)
self._lazy_setfield = None
def getfield_from_cache(self, optheap, opinfo, descr):
diff --git a/rpython/jit/metainterp/optimizeopt/pure.py
b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -30,7 +30,7 @@
op = self.lst[i]
if op is None:
break
- if opt.get_box_replacement(op.getarg(0)).same_box(box0) and
op.getdescr() is descr:
+ if box0.same_box(opt.get_box_replacement(op.getarg(0))) and
op.getdescr() is descr:
op = self.force_preamble_op(opt, op, i)
return opt.get_box_replacement(op)
return None
@@ -40,8 +40,9 @@
op = self.lst[i]
if op is None:
break
- if (opt.get_box_replacement(op.getarg(0)).same_box(box0) and
opt.get_box_replacement(op.getarg(1)).same_box(box1)
- and op.getdescr() is descr):
+ if (box0.same_box(opt.get_box_replacement(op.getarg(0))) and
+ box1.same_box(opt.get_box_replacement(op.getarg(1))) and
+ op.getdescr() is descr):
op = self.force_preamble_op(opt, op, i)
return opt.get_box_replacement(op)
return None
diff --git a/rpython/jit/metainterp/optimizeopt/shortpreamble.py
b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
--- a/rpython/jit/metainterp/optimizeopt/shortpreamble.py
+++ b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
@@ -99,7 +99,11 @@
optpure = opt.optimizer.optpure
if optpure is None:
return
- op = self.res
+ if invented_name:
+ op = self.orig_op.copy_and_change(self.orig_op.getopnum())
+ op.set_forwarded(self.res)
+ else:
+ op = self.res
if preamble_op.is_call():
optpure.extra_call_pure.append(PreambleOp(op, preamble_op,
invented_name))
@@ -199,8 +203,7 @@
return ProducedShortOp(self, self.preamble_op)
def produce_op(self, opt, preamble_op, exported_infos, invented_name):
- pass
- #assert not invented_name
+ assert not invented_name
def __repr__(self):
return "INP(%r -> %r)" % (self.res, self.preamble_op)
@@ -233,8 +236,7 @@
self.add_op_to_short(shortop)
#
for op, produced_op in self.produced_short_boxes.iteritems():
- if not isinstance(produced_op, ShortInputArg):
- short_boxes.append(produced_op)
+ short_boxes.append(produced_op)
for short_op in self.const_short_boxes:
getfield_op = short_op.getfield_op
@@ -262,13 +264,13 @@
else:
return None
- def _pick_op_index(self, lst, pick_inparg=True):
+ def _pick_op_index(self, lst, pick_other=True):
index = -1
for i, item in enumerate(lst):
if (not isinstance(item.short_op, HeapOp) and
- (pick_inparg or not isinstance(item.short_op, ShortInputArg))):
+ (pick_other or isinstance(item.short_op, ShortInputArg))):
if index != -1:
- assert pick_inparg
+ assert pick_other
return self._pick_op_index(lst, False)
index = i
if index == -1:
@@ -293,7 +295,9 @@
opnum = OpHelpers.same_as_for_type(shortop.res.type)
new_name = ResOperation(opnum, [shortop.res])
assert lst[i].short_op is not pop.short_op
+ orig_op = lst[i].short_op.res
lst[i].short_op.res = new_name
+ lst[i].short_op.orig_op = orig_op
lst[i].invented_name = True
self.produced_short_boxes[new_name] = lst[i]
else:
@@ -389,9 +393,6 @@
info = empty_info
preamble_op.set_forwarded(info)
self.short = []
- self.label_dict = {}
- for arg in label_args:
- self.label_dict[arg] = None
self.used_boxes = []
self.short_preamble_jump = []
self.extra_same_as = []
@@ -401,12 +402,9 @@
""" Notice that we're actually using the preamble_op, add it to
label and jump
"""
+ op = preamble_op.op.get_box_replacement()
if preamble_op.invented_name:
- self.extra_same_as.append(preamble_op.op)
- op = preamble_op.op
- if op in self.label_dict:
- return
- self.label_dict[op] = None
+ self.extra_same_as.append(op)
self.used_boxes.append(op)
self.short_preamble_jump.append(preamble_op.preamble_op)
@@ -434,12 +432,12 @@
self.label_args = label_args
def add_preamble_op(self, preamble_op):
+ """ Notice that we're actually using the preamble_op, add it to
+ label and jump
+ """
+ op = preamble_op.op.get_box_replacement()
if preamble_op.invented_name:
- self.extra_same_as.append(preamble_op.op)
- op = preamble_op.op
- if op in self.sb.label_dict:
- return
- self.sb.label_dict[op] = None
+ self.extra_same_as.append(op)
self.label_args.append(op)
self.jump_args.append(preamble_op.preamble_op)
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
@@ -2400,16 +2400,15 @@
guard_true(i3) []
i4 = int_neg(i2)
setfield_gc(p1, i2, descr=valuedescr)
- #i7 = same_as(i2) # This same_as should be killed by backend
- #i6 = same_as(i4)
- jump(p1, i1, i2, i4) #, i6)
- """
- expected = """
- [p1, i1, i2, i4] #, i5]
+ i6 = same_as_i(i4)
+ jump(p1, i1, i2, i4, i6)
+ """
+ expected = """
+ [p1, i1, i2, i4, i5]
setfield_gc(p1, i1, descr=valuedescr)
guard_true(i4) []
setfield_gc(p1, i2, descr=valuedescr)
- jump(p1, i1, i2, 1) # , i5)
+ jump(p1, i1, i2, i5, i5)
"""
self.optimize_loop(ops, expected, preamble)
@@ -2432,16 +2431,15 @@
i4 = int_neg(i2)
setfield_gc(p1, NULL, descr=nextdescr)
escape_n()
- #i5 = same_as(i4)
- jump(p1, i2, i4)
- """
- expected = """
- [p1, i2, i4] # i5
+ i5 = same_as_i(i4)
+ jump(p1, i2, i4, i5)
+ """
+ expected = """
+ [p1, i2, i4, i5]
guard_true(i4) [p1]
setfield_gc(p1, NULL, descr=nextdescr)
escape_n()
- jump(p1, i2, 1)
- #jump(p1, i2, i5, i5)
+ jump(p1, i2, i5, i5)
"""
self.optimize_loop(ops, expected, preamble)
@@ -2467,11 +2465,11 @@
jump(p1, i2, i4) #, i5)
"""
expected = """
- [p1, i2, i4] #, i5]
+ [p1, i2, i4, i5]
guard_true(i4) [i2, p1]
setfield_gc(p1, NULL, descr=nextdescr)
escape_n()
- jump(p1, i2, 1) #, i5)
+ jump(p1, i2, i5, i5)
"""
self.optimize_loop(ops, expected)
@@ -2494,17 +2492,16 @@
guard_true(i5) []
i4 = int_neg(i2)
setfield_gc(p1, i2, descr=valuedescr)
- #i8 = same_as(i2) # This same_as should be killed by backend
- #i7 = same_as(i4)
- jump(p1, i1, i2, i4) #, i7)
- """
- expected = """
- [p1, i1, i2, i4] #, i7]
+ i7 = same_as_i(i4)
+ jump(p1, i1, i2, i4, i7)
+ """
+ expected = """
+ [p1, i1, i2, i4, i7]
setfield_gc(p1, i1, descr=valuedescr)
i5 = int_eq(i4, 5)
guard_true(i5) []
setfield_gc(p1, i2, descr=valuedescr)
- jump(p1, i1, i2, 5) # , i7)
+ jump(p1, i1, i2, i7, i7)
"""
self.optimize_loop(ops, expected, preamble)
@@ -2723,16 +2720,16 @@
p2 = new_with_vtable(descr=nodesize)
setfield_gc(p2, p4, descr=nextdescr)
setfield_gc(p1, p2, descr=nextdescr)
- #i101 = same_as(i4)
- jump(p1, i2, i4, p4) #, i101)
- """
- expected = """
- [p1, i2, i4, p4] #, i5]
+ i101 = same_as_i(i4)
+ jump(p1, i2, i4, p4, i101)
+ """
+ expected = """
+ [p1, i2, i4, p4, i5]
guard_true(i4) [p1, p4]
p2 = new_with_vtable(descr=nodesize)
setfield_gc(p2, p4, descr=nextdescr)
setfield_gc(p1, p2, descr=nextdescr)
- jump(p1, i2, 1, p4) #, i5)
+ jump(p1, i2, i5, p4, i5)
"""
self.optimize_loop(ops, expected, preamble)
@@ -3697,16 +3694,17 @@
jump(p1, i4, i3)
'''
expected = '''
- [p1, i4, i3]
- setfield_gc(p1, i3, descr=valuedescr)
- jump(p1, i3, i3)
+ [p1, i4, i3, i5]
+ setfield_gc(p1, i5, descr=valuedescr)
+ jump(p1, i3, i5, i5)
'''
preamble = '''
[p1, i1, i4]
setfield_gc(p1, i1, descr=valuedescr)
i3 = call_i(p1, descr=elidablecalldescr)
setfield_gc(p1, i3, descr=valuedescr)
- jump(p1, i4, i3)
+ ifoo = same_as_i(i3)
+ jump(p1, i4, i3, ifoo)
'''
self.optimize_loop(ops, expected, preamble)
@@ -3723,9 +3721,9 @@
jump(p1, i4, i3)
'''
expected = '''
- [p1, i4, i3]
- setfield_gc(p1, i3, descr=valuedescr)
- jump(p1, i3, i3)
+ [p1, i4, i3, i5]
+ setfield_gc(p1, i5, descr=valuedescr)
+ jump(p1, i3, i5, i5)
'''
preamble = '''
[p1, i1, i4]
@@ -3733,9 +3731,8 @@
i3 = call_i(p1, descr=elidable2calldescr)
guard_no_exception() []
setfield_gc(p1, i3, descr=valuedescr)
- #i148 = same_as(i3)
- #i147 = same_as(i3)
- jump(p1, i4, i3) #, i148)
+ i147 = same_as_i(i3)
+ jump(p1, i4, i3, i147)
'''
self.optimize_loop(ops, expected, preamble)
@@ -3781,16 +3778,16 @@
jump(p1, i4, i3)
'''
expected = '''
- [p1, i4, i3]
+ [p1, i4, i3, i5]
setfield_gc(p1, i4, descr=valuedescr)
- jump(p1, i3, i3)
+ jump(p1, i3, i5, i5)
'''
preamble = '''
[p1, i1, i4]
setfield_gc(p1, i1, descr=valuedescr)
i3 = call_i(p1, descr=elidablecalldescr)
- # i151 = same_as_i(i3)
- jump(p1, i4, i3)
+ i151 = same_as_i(i3)
+ jump(p1, i4, i3, i151)
'''
self.optimize_loop(ops, expected, preamble)
@@ -3810,14 +3807,14 @@
escape_n(i1)
escape_n(i2)
i4 = call_i(123456, 4, i0, 6, descr=elidablecalldescr)
- # i153 = same_as_i(i4)
- jump(i0, i4)
+ i153 = same_as_i(i4)
+ jump(i0, i4, i153)
'''
expected = '''
- [i0, i4]
+ [i0, i4, i5]
escape_n(42)
escape_n(i4)
- jump(i0, i4)
+ jump(i0, i5, i5)
'''
self.optimize_loop(ops, expected, preamble, call_pure_results)
@@ -3834,12 +3831,13 @@
escape_n(i0)
i3 = call_i(123456, p0, descr=elidable2calldescr)
guard_no_exception() []
- jump(p0, i3)
+ ifoo = same_as_i(i3)
+ jump(p0, i3, ifoo)
'''
expected = '''
- [p0, i3]
+ [p0, i3, ifoo]
escape_n(i3)
- jump(p0, i3)
+ jump(p0, ifoo, ifoo)
'''
self.optimize_loop(ops, expected, preamble)
@@ -4686,7 +4684,6 @@
[i0, p0]
p1 = new_array(i0, descr=gcarraydescr)
i1 = arraylen_gc(p1)
- ifoo = arraylen_gc(p0, descr=gcarraydescr)
setarrayitem_gc(p0, 0, p1, descr=gcarraydescr)
jump(i0, p0)
"""
@@ -6421,12 +6418,13 @@
[p1, i1, i2, i3]
escape_n(i3)
i4 = int_sub(i2, i1)
- jump(p1, i1, i2, i4)
- """
- expected = """
- [p1, i1, i2, i3]
+ i5 = same_as_i(i4)
+ jump(p1, i1, i2, i4, i5)
+ """
+ expected = """
+ [p1, i1, i2, i3, i5]
escape_n(i3)
- jump(p1, i1, i2, i3)
+ jump(p1, i1, i2, i5, i5)
"""
self.optimize_strunicode_loop(ops, expected, preamble)
@@ -8156,9 +8154,9 @@
jump(i1, i3)
"""
expected = """
- [i1, i2, i3]
+ [i1, i2, i3, i4]
call_n(i3, descr=nonwritedescr)
- jump(i1, i2, i3)
+ jump(i1, i2, i3, i4)
"""
short = """
[i1, i2]
@@ -8166,7 +8164,7 @@
i4 = int_add(i3, i3)
i5 = int_add(i4, i4)
i6 = int_add(i5, i5)
- jump(i6)
+ jump(i6, i3)
"""
self.optimize_loop(ops, expected, expected_short=short)
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
@@ -21,8 +21,10 @@
self.optunroll.short_preamble_producer.use_box(op,
preamble_op.preamble_op, self)
if not preamble_op.op.is_constant():
+ if preamble_op.invented_name:
+ op = self.get_box_replacement(op)
self.optunroll.potential_extra_ops[op] = preamble_op
- return op
+ return preamble_op.op
return preamble_op
def setinfo_from_preamble_list(self, lst, infos):
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
@@ -80,6 +80,11 @@
def getopnum(self):
return self.opnum
+ #def same_box(self, other):
+ # if self.is_same_as():
+ # return self is other or self.getarg(0).same_box(other)
+ # return self is other
+
def get_forwarded(self):
return self._forwarded
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit