Author: Richard Plangger <r...@pasra.at> Branch: vecopt-merge Changeset: r79165:c38afa242006 Date: 2015-08-23 19:40 +0200 http://bitbucket.org/pypy/pypy/changeset/c38afa242006/
Log: extended the llgraph to handle the stitching correctly (not yet fully finished) translation issue diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py --- a/rpython/jit/backend/llgraph/runner.py +++ b/rpython/jit/backend/llgraph/runner.py @@ -2,8 +2,8 @@ from rpython.jit.backend import model from rpython.jit.backend.llgraph import support from rpython.jit.backend.llsupport import symbolic -from rpython.jit.metainterp.history import AbstractDescr -from rpython.jit.metainterp.history import Const, getkind +from rpython.jit.metainterp.history import AbstractDescr, BoxVector +from rpython.jit.metainterp.history import Const, getkind, Box from rpython.jit.metainterp.history import INT, REF, FLOAT, VOID, VECTOR from rpython.jit.metainterp.resoperation import rop from rpython.jit.metainterp.optimizeopt import intbounds @@ -271,6 +271,7 @@ self.vinfo_for_tests = kwds.get('vinfo_for_tests', None) def stitch_bridge(self, faildescr, target): + import pdb; pdb.set_trace() faildescr._llgraph_bridge = target.lltrace def compile_loop(self, inputargs, operations, looptoken, jd_id=0, @@ -902,29 +903,36 @@ # ----------------------------------------------------- + def _accumulate(self, descr, failargs, value): + if not hasattr(descr, 'rd_accum_list'): + return + accum = descr.rd_accum_list + while accum is not None: + value = values[accum.scalar_position] + assert isinstance(value, list) + if accum.operation == '+': + value = sum(value) + break + elif accum.operation == '*': + def prod(acc, x): return acc * x + value = reduce(prod, value, 1) + break + else: + raise NotImplementedError("accum operator in fail guard") + values[accum.scalar_position] = value + accum = accum.prev + def fail_guard(self, descr, saved_data=None): values = [] for i,box in enumerate(self.current_op.getfailargs()): + if box.getaccum() or isinstance(box, BoxVector): + import pdb; pdb.set_trace(); if box is not None: value = self.env[box] else: value = None - if hasattr(descr, 'rd_accum_list'): - accum = descr.rd_accum_list - while accum != None: - if accum.position != i: - accum = accum.prev - continue - if accum.operation == '+': - value = sum(value) - break - elif accum.operation == '*': - def prod(acc, x): return acc * x - value = reduce(prod, value, 1) - break - else: - raise NotImplementedError("accum operator in fail guard") values.append(value) + self._accumulate(descr, self.current_op.getfailargs(), values) if hasattr(descr, '_llgraph_bridge'): target = (descr._llgraph_bridge, -1) values = [value for value in values if value is not None] diff --git a/rpython/jit/backend/x86/regalloc.py b/rpython/jit/backend/x86/regalloc.py --- a/rpython/jit/backend/x86/regalloc.py +++ b/rpython/jit/backend/x86/regalloc.py @@ -326,6 +326,7 @@ # on the descriptor loc = self.loc(accum.getoriginalbox()) faillocs.append(loc) + assert isinstance(descr, ResumeGuardDescr) descr.rd_accum_list = AccumInfo(descr.rd_accum_list, i, accum.operator, accum.getoriginalbox(), _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit