[pypy-commit] pypy vecopt: rpython hints, saving the loop version the compileloopversion descr
plan_rich
noreply at buildbot.pypy.org
Thu Jul 16 16:06:37 CEST 2015
Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r78559:841f77615665
Date: 2015-07-16 16:06 +0200
http://bitbucket.org/pypy/pypy/changeset/841f77615665/
Log: rpython hints, saving the loop version the compileloopversion descr
diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -612,7 +612,7 @@
addr = rawstart + tok.pos_jump_offset
tok.faildescr.adr_jump_offset = addr
descr = tok.faildescr
- if isinstance(descr, CompileLoopVersionDescr):
+ if descr.loop_version():
continue # patch them later
relative_target = tok.pos_recovery_stub - (tok.pos_jump_offset + 4)
assert rx86.fits_in_32bits(relative_target)
diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -725,6 +725,7 @@
operations = None
inputargs = None
faillocs = None
+ version = None
def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
assert 0, "this guard must never fail"
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
@@ -553,7 +553,7 @@
def save_to_descr(self, descr, position):
from rpython.jit.metainterp.compile import ResumeGuardDescr
from rpython.jit.metainterp.resume import AccumInfo
- assert isinstance(descr,ResumeGuardDescr)
+ assert isinstance(descr, ResumeGuardDescr)
ai = AccumInfo(descr.rd_accum_list, position, self.operator, self.var)
descr.rd_accum_list = ai
@@ -758,6 +758,7 @@
self.inputargs = label.getarglist()
def register_all_guards(self, opt_ops, invariant_arg_count=0):
+ from rpython.jit.metainterp.compile import CompileLoopVersionDescr
idx = index_of_first(rop.LABEL, opt_ops)
assert idx >= 0
version_failargs = opt_ops[idx].getarglist()
@@ -771,21 +772,26 @@
for op in opt_ops:
if op.is_guard():
- import pdb; pdb.set_trace()
assert isinstance(op, GuardResOp)
descr = op.getdescr()
if descr.loop_version():
- # currently there is only ONE versioning,
- # that is the original loop after unrolling.
- # if there are more possibilites, let the descr
- # know which loop version he preferes
- self.faildescrs.append(descr)
- op.setfailargs(version_failargs)
- op.rd_snapshot = None
+ assert isinstance(descr, CompileLoopVersionDescr)
+ if descr.version is None:
+ # currently there is only ONE versioning,
+ # that is the original loop after unrolling.
+ # if there are more possibilites, let the descr
+ # know which loop version he preferes
+ descr.version = self
+ self.faildescrs.append(descr)
+ op.setfailargs(version_failargs)
+ op.rd_snapshot = None
def register_guard(self, op):
+ from rpython.jit.metainterp.compile import CompileLoopVersionDescr
assert isinstance(op, GuardResOp)
descr = op.getdescr()
+ assert isinstance(descr, CompileLoopVersionDescr)
+ descr.version = self
self.faildescrs.append(descr)
op.setfailargs(self.inputargs)
op.rd_snapshot = None
diff --git a/rpython/jit/metainterp/optimizeopt/guard.py b/rpython/jit/metainterp/optimizeopt/guard.py
--- a/rpython/jit/metainterp/optimizeopt/guard.py
+++ b/rpython/jit/metainterp/optimizeopt/guard.py
@@ -16,12 +16,12 @@
""" An object wrapper around a guard. Helps to determine
if one guard implies another
"""
+ _attrs_ = ('index', 'op', 'cmp_op', 'rhs', 'lhs')
+
def __init__(self, index, op, cmp_op, index_vars):
self.index = index
self.op = op
self.cmp_op = cmp_op
- self.lhs_key = None
- self.rhs_key = None
lhs = cmp_op.getarg(0)
self.lhs = index_vars.get(lhs, None)
if self.lhs is None:
@@ -32,6 +32,15 @@
if self.rhs is None:
self.rhs = IndexVar(rhs)
+ def setindex(self, index):
+ self.index = index
+
+ def setoperation(self, op):
+ self.op = op
+
+ def setcmp(self, c):
+ self.cmp_op = c
+
def getleftkey(self):
return self.lhs.getvariable()
@@ -108,11 +117,10 @@
self.index = other.index
descr = myop.getdescr()
- if we_are_translated():
- descr.copy_all_attributes_from(other.op.getdescr())
- myop.rd_frame_info_list = otherop.rd_frame_info_list
- myop.rd_snapshot = otherop.rd_snapshot
- myop.setfailargs(otherop.getfailargs())
+ descr.copy_all_attributes_from(other.op.getdescr())
+ myop.rd_frame_info_list = otherop.rd_frame_info_list
+ myop.rd_snapshot = otherop.rd_snapshot
+ myop.setfailargs(otherop.getfailargs())
def emit_varops(self, opt, var, old_arg):
assert isinstance(var, IndexVar)
@@ -134,9 +142,9 @@
guard = self.op.clone()
guard.setarg(0, box_result)
opt.emit_operation(guard)
- guard.index = opt.operation_position()-1
- guard.op = guard
- guard.cmp_op = cmp_op
+ self.setindex(opt.operation_position()-1)
+ self.setoperation(guard)
+ self.setcmp(cmp_op)
def set_to_none(self, operations):
assert operations[self.index] is self.op
@@ -249,7 +257,7 @@
self.collect_guard_information(loop)
self.eliminate_guards(loop)
- if user_code:
+ if user_code or True:
version = loop.snapshot()
self.eliminate_array_bound_checks(loop, version)
@@ -278,23 +286,3 @@
loop.operations = self._newoperations + \
[op for op in loop.operations if op]
- # OLD
- #def _get_key(self, cmp_op):
- # assert cmp_op
- # lhs_arg = cmp_op.getarg(0)
- # rhs_arg = cmp_op.getarg(1)
- # lhs_index_var = self.index_vars.get(lhs_arg, None)
- # rhs_index_var = self.index_vars.get(rhs_arg, None)
-
- # cmp_opnum = cmp_op.getopnum()
- # # get the key, this identifies the guarded operation
- # if lhs_index_var and rhs_index_var:
- # return (lhs_index_var.getvariable(), cmp_opnum, rhs_index_var.getvariable())
- # elif lhs_index_var:
- # return (lhs_index_var.getvariable(), cmp_opnum, None)
- # elif rhs_index_var:
- # return (None, cmp_opnum, rhs_index_var)
- # else:
- # return (None, cmp_opnum, None)
- # return key
-
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
@@ -1366,8 +1366,6 @@
guard_not_invalidated(descr=<ResumeGuardNotInvalidated object at 0x7fc657d7be20>) [p1, p0, p5, p6, p7, p12, p13]
debug_merge_point(0, 0, '<code object <module>. file '/home/rich/proj/da/thesis/bench/user1.py'. line 2> #120 LOAD_CONST')
debug_merge_point(0, 0, '<code object <module>. file '/home/rich/proj/da/thesis/bench/user1.py'. line 2> #123 COMPARE_OP')
- i22 = int_lt(i14, 2024)
- guard_true(i22, descr=<ResumeGuardTrueDescr object at 0x7fc657d7bdc0>) [p1, p0, p5, p6, p7, p12, p13, i14]
debug_merge_point(0, 0, '<code object <module>. file '/home/rich/proj/da/thesis/bench/user1.py'. line 2> #126 POP_JUMP_IF_FALSE')
debug_merge_point(0, 0, '<code object <module>. file '/home/rich/proj/da/thesis/bench/user1.py'. line 2> #129 LOAD_NAME')
debug_merge_point(0, 0, '<code object <module>. file '/home/rich/proj/da/thesis/bench/user1.py'. line 2> #132 LOAD_NAME')
@@ -1400,6 +1398,8 @@
i36 = int_lt(i33, 0)
guard_false(i36, descr=<ResumeGuardFalseDescr object at 0x7fc657d7be80>) [p1, p0, p5, p6, p7, p12, p13, None, None, None]
debug_merge_point(0, 0, '<code object <module>. file '/home/rich/proj/da/thesis/bench/user1.py'. line 2> #117 LOAD_NAME')
+ i22 = int_lt(i14, 2024)
+ guard_true(i22, descr=<ResumeGuardTrueDescr object at 0x7fc657d7bdc0>) [p1, p0, p5, p6, p7, p12, p13, i14]
jump(p0, p1, p5, p6, p7, p12, p13, i31, i15, i16, i17, i18, i19, i20)
"""
# schedule 885 -> ptype is non for raw_load?
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
@@ -49,14 +49,13 @@
start = time.clock()
#
#
- opt = VectorizingOptimizer(metainterp_sd, jitdriver_sd, loop, cost_threshold)
+ opt = VectorizingOptimizer(metainterp_sd, jitdriver_sd, loop, 0)
opt.propagate_all_forward()
gso = GuardStrengthenOpt(opt.dependency_graph.index_vars)
user_code = not jitdriver_sd.vectorize and warmstate.vectorize_user
gso.propagate_all_forward(opt.loop, user_code)
- # loop versioning
+ # connect all compile loop version fail descriptors to this version
version.register_all_guards(loop.operations, opt.appended_arg_count)
- loop.versions.append(version)
#
#
end = time.clock()
@@ -66,20 +65,23 @@
#
nano = int((end-start)*10.0**9)
debug_print("# vecopt factor: %d opcount: (%d -> %d) took %dns" % \
- (opt.unroll_count+1, len(orig_ops), len(loop.operations), nano))
+ (opt.unroll_count+1, len(version.operations), len(loop.operations), nano))
debug_stop("vec-opt-loop")
#
except NotAVectorizeableLoop:
debug_stop("vec-opt-loop")
# vectorization is not possible
- loop.operations = orig_ops
+ loop.operations = version.operations
+ loop.versions = None
except NotAProfitableLoop:
debug_stop("vec-opt-loop")
# cost model says to skip this loop
- loop.operations = orig_ops
+ loop.operations = version.operations
+ loop.versions = None
except Exception as e:
debug_stop("vec-opt-loop")
- loop.operations = orig_ops
+ loop.operations = version.operations
+ loop.versions = None
debug_print("failed to vectorize loop. THIS IS A FATAL ERROR!")
if we_are_translated():
from rpython.rtyper.lltypesystem import lltype
More information about the pypy-commit
mailing list