Author: Richard Plangger <[email protected]>
Branch: vecopt2
Changeset: r77080:236a9b21cf32
Date: 2015-03-16 14:15 +0100
http://bitbucket.org/pypy/pypy/changeset/236a9b21cf32/
Log: debug_merge_points are not unrolled, but only prepended & appended
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
@@ -532,6 +532,17 @@
self.assert_memory_ref_not_adjacent(mref, mref2)
assert mref != mref2
+ def test_do_not_unroll_debug_merge_point(self):
+ ops = """
+ []
+ debug_merge_point(0, 0, 'loc 1')
+ debug_merge_point(0, 0, 'loc 1')
+ jump()
+ """
+ loop = self.parse_loop(ops)
+ vopt = self.vec_optimizer_unrolled(loop,2)
+ self.assert_equal(loop, self.parse_loop(ops))
+
class TestLLtype(BaseTestDependencyGraph, LLtypeMixin):
pass
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
@@ -30,13 +30,22 @@
def __init__(self, metainterp_sd, jitdriver_sd, loop, optimizations):
Optimizer.__init__(self, metainterp_sd, jitdriver_sd, loop,
optimizations)
- self.vec_info = LoopVectorizeInfo()
+ self.vec_info = LoopVectorizeInfo(self)
self.memory_refs = []
self.dependency_graph = None
+ self.first_debug_merge_point = False
+ self.last_debug_merge_point = None
def emit_unrolled_operation(self, op):
+ if op.getopnum() == rop.DEBUG_MERGE_POINT:
+ self.last_debug_merge_point = op
+ if not self.first_debug_merge_point:
+ self.first_debug_merge_point = True
+ else:
+ return False
self._last_emitted_op = op
self._newoperations.append(op)
+ return True
def _rename_arguments_ssa(self, rename_map, label_args, jump_args):
# fill the map with the renaming boxes. keys are boxes from the label
@@ -50,27 +59,29 @@
rename_map[la] = ja
def unroll_loop_iterations(self, loop, unroll_factor):
+ op_count = len(loop.operations)
+
label_op = loop.operations[0]
- jump_op = loop.operations[-1]
+ jump_op = loop.operations[op_count-1]
+
+ self.vec_info.track_memory_refs = True
+
+ self.emit_unrolled_operation(label_op)
# TODO use the new optimizer structure (branch of fijal currently)
label_op_args = [self.getvalue(box).get_key_box() for box in
label_op.getarglist()]
values = [self.getvalue(box) for box in label_op.getarglist()]
operations = []
- self.emit_unrolled_operation(label_op)
-
- for i in range(1,len(loop.operations)-1):
+ for i in range(1,op_count-1):
op = loop.operations[i].clone()
operations.append(op)
self.emit_unrolled_operation(op)
-
- op_index = len(operations) + 1
-
+ self.vec_info.inspect_operation(op)
jump_op_args = jump_op.getarglist()
rename_map = {}
- for unroll_i in range(2, unroll_factor+1):
+ for i in range(2, unroll_factor+1):
# for each unrolling factor the boxes are renamed.
self._rename_arguments_ssa(rename_map, label_op_args, jump_op_args)
for op in operations:
@@ -91,9 +102,7 @@
except KeyError:
pass
- self.vec_info._op_index = op_index
self.emit_unrolled_operation(copied_op)
- op_index += 1
self.vec_info.inspect_operation(copied_op)
# the jump arguments have been changed
@@ -110,11 +119,14 @@
# map will be rebuilt, the jump operation has been updated already
rename_map.clear()
+ if self.last_debug_merge_point is not None:
+ self._last_emitted_op = self.last_debug_merge_point
+ self._newoperations.append(self.last_debug_merge_point)
self.emit_unrolled_operation(jump_op)
- def _gather_trace_information(self, loop):
+ def _gather_trace_information(self, loop, track_memref = False):
+ self.vec_info.track_memory_refs = track_memref
for i,op in enumerate(loop.operations):
- self.vec_info._op_index = i
self.vec_info.inspect_operation(op)
def get_estimated_unroll_factor(self, force_reg_bytes = -1):
@@ -317,18 +329,21 @@
default=IntegralMod.default_operation)
IntegralMod.inspect_operation = integral_dispatch_opt
+
class LoopVectorizeInfo(object):
- def __init__(self):
+ def __init__(self, optimizer):
+ self.optimizer = optimizer
self.smallest_type_bytes = 0
- self._op_index = 0
self.memory_refs = {}
- self.label_op = None
+ self.track_memory_refs = False
def operation_RAW_LOAD(self, op):
descr = op.getdescr()
- self.memory_refs[self._op_index] = \
- MemoryRef(op.getarg(0), op.getarg(1), op.getdescr())
+ if self.track_memory_refs:
+ idx = len(self.optimizer._newoperations)-1
+ self.memory_refs[idx] = \
+ MemoryRef(op.getarg(0), op.getarg(1), op.getdescr())
if not descr.is_array_of_pointers():
byte_count = descr.get_item_size_in_bytes()
if self.smallest_type_bytes == 0 \
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit