[pypy-commit] pypy vecopt: correctly emitting normal guards not subject of the strengh opt
plan_rich
noreply at buildbot.pypy.org
Thu May 28 16:45:33 CEST 2015
Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r77655:f9c2fe944393
Date: 2015-05-28 15:50 +0200
http://bitbucket.org/pypy/pypy/changeset/f9c2fe944393/
Log: correctly emitting normal guards not subject of the strengh opt
copying failargs, descr and frame info on strength opt added some
traces to test_vectorize
diff --git a/pypy/module/micronumpy/test/test_zjit.py b/pypy/module/micronumpy/test/test_zjit.py
--- a/pypy/module/micronumpy/test/test_zjit.py
+++ b/pypy/module/micronumpy/test/test_zjit.py
@@ -347,7 +347,6 @@
"""
def test_reduce_compile_only_once(self):
- py.test.skip('TODO')
self.compile_graph()
reset_jit()
i = self.code_mapping['reduce']
@@ -358,7 +357,6 @@
assert len(get_stats().loops) == 1
def test_reduce_axis_compile_only_once(self):
- py.test.skip('TODO')
self.compile_graph()
reset_jit()
i = self.code_mapping['axissum']
@@ -375,22 +373,12 @@
"""
def test_prod(self):
- py.test.skip('TODO')
result = self.run("prod")
expected = 1
for i in range(30):
expected *= i * 2
assert result == expected
self.check_trace_count(1)
- self.check_simple_loop({
- 'float_mul': 1,
- 'guard_false': 1,
- 'guard_not_invalidated': 1,
- 'int_add': 2,
- 'int_ge': 1,
- 'jump': 1,
- 'raw_load': 1,
- })
def define_max():
return """
@@ -400,38 +388,9 @@
"""
def test_max(self):
- py.test.skip('TODO')
result = self.run("max")
assert result == 128
self.check_trace_count(3)
- self.check_simple_loop({
- 'float_ge': 1,
- 'float_ne': 1,
- 'guard_false': 3,
- 'guard_not_invalidated': 1,
- 'int_add': 2,
- 'int_ge': 1,
- 'jump': 1,
- 'raw_load': 1,
- })
- self.check_resops({
- 'float_ge': 2,
- 'float_ne': 2,
- 'getfield_gc': 4,
- 'getfield_gc_pure': 30,
- 'guard_class': 1,
- 'guard_false': 8,
- 'guard_nonnull': 2,
- 'guard_nonnull_class': 2,
- 'guard_not_invalidated': 2,
- 'guard_true': 7,
- 'guard_value': 2,
- 'int_add': 8,
- 'int_ge': 4,
- 'int_is_true': 3,
- 'jump': 3,
- 'raw_load': 2,
- })
def define_min():
return """
@@ -441,20 +400,9 @@
"""
def test_min(self):
- py.test.skip('TODO')
result = self.run("min")
assert result == -128
self.check_trace_count(1)
- self.check_simple_loop({
- 'float_le': 1,
- 'guard_false': 1,
- 'guard_not_invalidated': 1,
- 'guard_true': 1,
- 'int_add': 2,
- 'int_ge': 1,
- 'jump': 1,
- 'raw_load': 1,
- })
def define_any():
return """
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
@@ -1278,6 +1278,25 @@
opt = self.vectorize(self.parse_loop(trace))
self.debug_print_operations(opt.loop)
+ def test_max(self):
+ trace = """
+ [p3, i4, p2, i5, f6, i7, i8]
+ guard_early_exit() [p2, f6, i4, i5, p3]
+ f9 = raw_load(i7, i5, descr=floatarraydescr)
+ guard_not_invalidated() [p2, f9, f6, i4, i5, p3]
+ i10 = float_ge(f6, f9)
+ guard_false(i10) [p2, f9, f6, None, i4, i5, p3]
+ i12 = float_ne(f6, f6)
+ guard_false(i12) [p2, f9, f6, None, i4, i5, p3]
+ i14 = int_add(i4, 1)
+ i16 = int_add(i5, 8)
+ i17 = int_ge(i14, i8)
+ guard_false(i17) [p2, i16, f9, i14, None, None, None, p3]
+ jump(p3, i14, p2, i16, f9, i7, i8)
+ """
+ opt = self.vectorize(self.parse_loop(trace))
+ self.debug_print_operations(opt.loop)
+
def test_reduction_basic(self):
trace = """
[p5, i6, p2, i7, p1, p8, i9, i10, f11, i12, i13, i14]
diff --git a/rpython/jit/metainterp/optimizeopt/vectorize.py b/rpython/jit/metainterp/optimizeopt/vectorize.py
--- a/rpython/jit/metainterp/optimizeopt/vectorize.py
+++ b/rpython/jit/metainterp/optimizeopt/vectorize.py
@@ -35,10 +35,7 @@
for i,op in enumerate(loop.operations):
print "[",str(i).center(2," "),"]",op,
if op.is_guard():
- if op.rd_snapshot is not None:
- print ps(op.rd_snapshot)
- else:
- print op.getfailargs()
+ print op.getfailargs()
else:
print ""
@@ -356,13 +353,14 @@
self.clear_newoperations()
sched_data = VecScheduleData(self.metainterp_sd.cpu.vector_register_size)
scheduler = Scheduler(self.dependency_graph, sched_data)
+ renamer = Renamer()
while scheduler.has_more():
position = len(self._newoperations)
ops = scheduler.next(position)
for op in ops:
if self.tried_to_pack:
- self.unpack_from_vector(op, sched_data)
- self.emit_operation(op)
+ self.unpack_from_vector(op, sched_data, renamer)
+ self.emit_operation(op), op.getfailargs()
if not we_are_translated():
for node in self.dependency_graph.nodes:
@@ -370,26 +368,27 @@
self.loop.operations = self._newoperations[:]
self.clear_newoperations()
- def unpack_from_vector(self, op, sched_data):
+ def unpack_from_vector(self, op, sched_data, renamer):
+ renamer.rename(op)
args = op.getarglist()
for i, arg in enumerate(op.getarglist()):
if isinstance(arg, Box):
- argument = self._unpack_from_vector(i, arg, sched_data)
+ argument = self._unpack_from_vector(i, arg, sched_data, renamer)
if arg is not argument:
op.setarg(i, argument)
if op.is_guard():
fail_args = op.getfailargs()
for i, arg in enumerate(fail_args):
if arg and isinstance(arg, Box):
- argument = self._unpack_from_vector(i, arg, sched_data)
+ argument = self._unpack_from_vector(i, arg, sched_data, renamer)
if arg is not argument:
fail_args[i] = argument
- def _unpack_from_vector(self, i, arg, sched_data):
- arg = sched_data.unpack_rename(arg)
+ def _unpack_from_vector(self, i, arg, sched_data, renamer):
(j, vbox) = sched_data.box_to_vbox.get(arg, (-1, None))
if vbox:
arg_cloned = arg.clonebox()
+ renamer.start_renaming(arg, arg_cloned)
cj = ConstInt(j)
ci = ConstInt(1)
opnum = rop.VEC_FLOAT_UNPACK
@@ -397,8 +396,7 @@
opnum = rop.VEC_INT_UNPACK
unpack_op = ResOperation(opnum, [vbox, cj, ci], arg_cloned)
self.emit_operation(unpack_op)
- sched_data.rename_unpacked(arg, arg_cloned)
- arg = arg_cloned
+ return arg_cloned
return arg
def analyse_index_calculations(self):
@@ -665,16 +663,26 @@
guard = Guard(i, op, cmp_op,
lhs, lhs_arg, rhs, rhs_arg)
if guard.implies(other, self):
+ op.setfailargs(other.op.getfailargs())
+ op.setdescr(other.op.getdescr())
+ op.rd_frame_info_list = other.op.rd_frame_info_list
+ op.rd_snapshot = other.op.rd_snapshot
+
strongest_guards[key] = guard
guard.stronger = True
guard.index = other.index
guards[other.index] = guard
+
# do not mark as emit
continue
elif other.implies(guard, self):
guard.implied = True
# mark as emit
guards[i] = guard
+ else:
+ # emit non guard_true/false guards
+ guards[i] = Guard(i, op, None, None, None, None, None)
+
strongest_guards = None
#
self.renamer = Renamer()
@@ -703,7 +711,6 @@
self.renamer.rename(op)
self._newoperations.append(op)
-
def must_unpack_result_to_exec(op, target_op):
# TODO either move to resop or util
if op.getoperation().vector != -1:
@@ -1106,17 +1113,10 @@
class VecScheduleData(SchedulerData):
def __init__(self, vec_reg_size):
self.box_to_vbox = {}
- self.unpack_rename_map = {}
self.preamble_ops = None
self.expansion_byte_count = -1
self.vec_reg_size = vec_reg_size
- def unpack_rename(self, arg):
- return self.unpack_rename_map.get(arg, arg)
-
- def rename_unpacked(self, arg, argdest):
- self.unpack_rename_map[arg] = argdest
-
def as_vector_operation(self, pack):
op_count = len(pack.operations)
assert op_count > 1
More information about the pypy-commit
mailing list