Author: Maciej Fijalkowski <fij...@gmail.com> Branch: result-in-resops Changeset: r56426:0f21f87ea7f0 Date: 2012-07-24 16:24 +0200 http://bitbucket.org/pypy/pypy/changeset/0f21f87ea7f0/
Log: fix oparser diff --git a/pypy/jit/backend/llgraph/runner.py b/pypy/jit/backend/llgraph/runner.py --- a/pypy/jit/backend/llgraph/runner.py +++ b/pypy/jit/backend/llgraph/runner.py @@ -233,17 +233,12 @@ else: llimpl.compile_add_fail_arg(c, -1) - x = op.result - if x is not None: - if isinstance(x, history.BoxInt): - var2index[x] = llimpl.compile_add_int_result(c) - elif isinstance(x, self.ts.BoxRef): - var2index[x] = llimpl.compile_add_ref_result(c, self.ts.BASETYPE) - elif isinstance(x, history.BoxFloat): - var2index[x] = llimpl.compile_add_float_result(c) - else: - raise Exception("%s.result contain: %r" % (op.getopname(), - x)) + if op.type == INT: + var2index[x] = llimpl.compile_add_int_result(c) + elif op.type == REF: + var2index[x] = llimpl.compile_add_ref_result(c, self.ts.BASETYPE) + elif op.type == FLOAT: + var2index[x] = llimpl.compile_add_float_result(c) op = operations[-1] assert op.is_final() if op.getopnum() == rop.JUMP: diff --git a/pypy/jit/backend/llgraph/test/test_llgraph.py b/pypy/jit/backend/llgraph/test/test_llgraph.py --- a/pypy/jit/backend/llgraph/test/test_llgraph.py +++ b/pypy/jit/backend/llgraph/test/test_llgraph.py @@ -1,12 +1,6 @@ import py -from pypy.rpython.lltypesystem import lltype, llmemory, rstr, rclass -from pypy.rpython.test.test_llinterp import interpret -from pypy.rlib.unroll import unrolling_iterable +from pypy.rpython.lltypesystem import lltype, llmemory -from pypy.jit.metainterp.history import BoxInt, BoxPtr, Const, ConstInt,\ - TreeLoop -from pypy.jit.metainterp.resoperation import ResOperation, rop -from pypy.jit.metainterp.executor import execute from pypy.jit.codewriter import heaptracker from pypy.jit.backend.test.runner_test import LLtypeBackendTest diff --git a/pypy/jit/backend/test/runner_test.py b/pypy/jit/backend/test/runner_test.py --- a/pypy/jit/backend/test/runner_test.py +++ b/pypy/jit/backend/test/runner_test.py @@ -7,7 +7,7 @@ ConstInt, ConstPtr, BoxObj, ConstObj, BoxFloat, ConstFloat) -from pypy.jit.metainterp.resoperation import ResOperation, rop +from pypy.jit.metainterp.resoperation import rop from pypy.jit.metainterp.typesystem import deref from pypy.jit.codewriter.effectinfo import EffectInfo from pypy.jit.tool.oparser import parse diff --git a/pypy/jit/metainterp/history.py b/pypy/jit/metainterp/history.py --- a/pypy/jit/metainterp/history.py +++ b/pypy/jit/metainterp/history.py @@ -387,6 +387,9 @@ def forget_value(self): raise NotImplementedError + def is_constant(self): + return False + class BoxInt(Box): type = INT _attrs_ = ('value',) @@ -739,11 +742,7 @@ assert box in seen else: assert op.getfailargs() is None - box = op.result - if box is not None: - assert isinstance(box, Box) - assert box not in seen - seen[box] = True + seen[op] = True if op.getopnum() == rop.LABEL: inputargs = op.getarglist() for box in inputargs: diff --git a/pypy/jit/metainterp/logger.py b/pypy/jit/metainterp/logger.py --- a/pypy/jit/metainterp/logger.py +++ b/pypy/jit/metainterp/logger.py @@ -123,8 +123,8 @@ s_offset = "+%d: " % offset args = ", ".join([self.repr_of_arg(op.getarg(i)) for i in range(op.numargs())]) - if op.result is not None: - res = self.repr_of_arg(op.result) + " = " + if op.getresultrepr() is not None: + res = self.repr_of_arg(op) + " = " else: res = "" is_guard = op.is_guard() diff --git a/pypy/jit/metainterp/optimizeopt/__init__.py b/pypy/jit/metainterp/optimizeopt/__init__.py --- a/pypy/jit/metainterp/optimizeopt/__init__.py +++ b/pypy/jit/metainterp/optimizeopt/__init__.py @@ -59,6 +59,8 @@ """Optimize loop.operations to remove internal overheadish operations. """ + return + debug_start("jit-optimize") try: loop.logops = metainterp_sd.logger_noopt.log_loop(loop.inputargs, diff --git a/pypy/jit/metainterp/optimizeopt/earlyforce.py b/pypy/jit/metainterp/optimizeopt/earlyforce.py --- a/pypy/jit/metainterp/optimizeopt/earlyforce.py +++ b/pypy/jit/metainterp/optimizeopt/earlyforce.py @@ -8,7 +8,9 @@ if (opnum != rop.SETFIELD_GC and opnum != rop.SETARRAYITEM_GC and opnum != rop.QUASIIMMUT_FIELD and - opnum != rop.SAME_AS and + opnum != rop.SAME_AS_i and + opnum != rop.SAME_AS_p and + opnum != rop.SAME_AS_f and opnum != rop.MARK_OPAQUE_PTR): for arg in op.getarglist(): diff --git a/pypy/jit/metainterp/optimizeopt/heap.py b/pypy/jit/metainterp/optimizeopt/heap.py --- a/pypy/jit/metainterp/optimizeopt/heap.py +++ b/pypy/jit/metainterp/optimizeopt/heap.py @@ -4,7 +4,7 @@ from pypy.jit.metainterp.optimizeopt.optimizer import Optimization, MODE_ARRAY from pypy.jit.metainterp.history import ConstInt, Const from pypy.jit.metainterp.optimizeopt.util import make_dispatcher_method -from pypy.jit.metainterp.resoperation import rop +from pypy.jit.metainterp.resoperation import rop, opgroups from pypy.rlib.objectmodel import we_are_translated @@ -230,7 +230,7 @@ posponedop = self.posponedop self.posponedop = None self.next_optimization.propagate_forward(posponedop) - if (op.is_comparison() or op.getopnum() == rop.CALL_MAY_FORCE + if (op.is_comparison() or op.getopnum() in opgroups.CALL_MAY_FORCE or op.is_ovf()): self.posponedop = op else: diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py b/pypy/jit/metainterp/optimizeopt/intbounds.py --- a/pypy/jit/metainterp/optimizeopt/intbounds.py +++ b/pypy/jit/metainterp/optimizeopt/intbounds.py @@ -87,7 +87,7 @@ v1 = self.getvalue(op.getarg(0)) v2 = self.getvalue(op.getarg(1)) self.emit_operation(op) - r = self.getvalue(op.result) + r = self.getvalue(op) b = v1.intbound.add_bound(v2.intbound) if b.bounded(): r.intbound.intersect(b) diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py --- a/pypy/jit/metainterp/optimizeopt/optimizer.py +++ b/pypy/jit/metainterp/optimizeopt/optimizer.py @@ -6,7 +6,7 @@ IntLowerBound, MININT, MAXINT from pypy.jit.metainterp.optimizeopt.util import (make_dispatcher_method, args_dict) -from pypy.jit.metainterp.resoperation import rop, AbstractResOp +from pypy.jit.metainterp.resoperation import rop, AbstractResOp, opgroups from pypy.jit.metainterp.typesystem import llhelper, oohelper from pypy.tool.pairtype import extendabletype from pypy.rlib.debug import debug_start, debug_stop, debug_print @@ -348,7 +348,6 @@ self.opaque_pointers = {} self.replaces_guard = {} self._newoperations = [] - self.seen_results = {} self.optimizer = self self.optpure = None self.optearlyforce = None @@ -453,7 +452,6 @@ def clear_newoperations(self): self._newoperations = [] - self.seen_results = {} def make_equal_to(self, box, value, replace=False): assert isinstance(value, OptValue) @@ -515,17 +513,17 @@ self.first_optimization.propagate_forward(op) def propagate_forward(self, op): - self.producer[op.result] = op + self.producer[op] = op dispatch_opt(self, op) def emit_operation(self, op): if op.returns_bool_result(): - self.bool_boxes[self.getvalue(op.result)] = None + self.bool_boxes[self.getvalue(op)] = None self._emit_operation(op) @specialize.argtype(0) def _emit_operation(self, op): - assert op.getopnum() != rop.CALL_PURE + assert op.getopnum() not in opgroups.CALL_PURE for i in range(op.numargs()): arg = op.getarg(i) try: @@ -546,10 +544,6 @@ op = self.store_final_boxes_in_guard(op) elif op.can_raise(): self.exception_might_have_happened = True - if op.result: - if op.result in self.seen_results: - raise ValueError, "invalid optimization" - self.seen_results[op.result] = None self._newoperations.append(op) def replace_op(self, old_op, new_op): diff --git a/pypy/jit/metainterp/optimizeopt/pure.py b/pypy/jit/metainterp/optimizeopt/pure.py --- a/pypy/jit/metainterp/optimizeopt/pure.py +++ b/pypy/jit/metainterp/optimizeopt/pure.py @@ -95,8 +95,8 @@ def setup(self): self.optimizer.optpure = self - def pure(self, opnum, args, result): - op = ResOperation(opnum, args, result) + def pure(self, opnum, arg0, arg1, result): + op = create_resopt_2(opnum, args, result) key = self.optimizer.make_args_key(op) if key not in self.pure_operations: self.pure_operations[key] = op diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py b/pypy/jit/metainterp/optimizeopt/rewrite.py --- a/pypy/jit/metainterp/optimizeopt/rewrite.py +++ b/pypy/jit/metainterp/optimizeopt/rewrite.py @@ -121,8 +121,9 @@ else: self.emit_operation(op) # Synthesize the reverse op for optimize_default to reuse - self.pure(rop.INT_SUB, [op.result, op.getarg(1)], op.getarg(0)) - self.pure(rop.INT_SUB, [op.result, op.getarg(0)], op.getarg(1)) + # XXX disable for now + #self.pure(rop.INT_SUB, [op, op.getarg(1)], op.getarg(0)) + #self.pure(rop.INT_SUB, [op, op.getarg(0)], op.getarg(1)) def optimize_INT_MUL(self, op): v1 = self.getvalue(op.getarg(0)) diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py --- a/pypy/jit/metainterp/resoperation.py +++ b/pypy/jit/metainterp/resoperation.py @@ -10,6 +10,20 @@ STRUCT = 's' VOID = 'v' +def create_resop_dispatch(opnum, result, args, descr=None): + cls = opclasses[opnum] + if cls.NUMARGS == 0: + return create_resop_0(opnum, result, descr) + elif cls.NUMARGS == 1: + return create_resop_1(opnum, result, args[0], descr) + elif cls.NUMARGS == 2: + return create_resop_2(opnum, result, args[0], args[1], descr) + elif cls.NUMARGS == 3: + return create_resop_1(opnum, result, args[0], args[1], args[2], + args[3], descr) + else: + return create_resop(opnum, result, args, descr) + @specialize.arg(0) def create_resop(opnum, result, args, descr=None): cls = opclasses[opnum] @@ -813,6 +827,9 @@ class rop(object): pass +class rop_lowercase(object): + pass # for convinience + opclasses = [] # mapping numbers to the concrete ResOp class opname = {} # mapping numbers to the original names, for debugging oparity = [] # mapping numbers to the arity of the operation or -1 @@ -820,6 +837,9 @@ opboolresult= [] # mapping numbers to a flag "returns a boolean" optp = [] # mapping numbers to typename of returnval 'i', 'p', 'N' or 'f' +class opgroups(object): + pass + def setup(debug_print=False): i = 0 for basename in _oplist: @@ -829,6 +849,8 @@ boolresult = 'b' in arity arity = arity.rstrip('db') if arity == '*': + setattr(opgroups, basename, (basename + '_i', basename + '_N', + basename + '_f', basename + '_p')) arity = -1 else: arity = int(arity) @@ -852,6 +874,10 @@ assert (len(opclasses)==len(oparity)==len(opwithdescr) ==len(opboolresult)) + for k, v in rop.__dict__.iteritems(): + if not k.startswith('__'): + setattr(rop_lowercase, k.lower(), v) + def get_base_class(mixin, tpmixin, base): try: return get_base_class.cache[(mixin, tpmixin, base)] diff --git a/pypy/jit/tool/oparser.py b/pypy/jit/tool/oparser.py --- a/pypy/jit/tool/oparser.py +++ b/pypy/jit/tool/oparser.py @@ -5,14 +5,15 @@ from pypy.jit.tool.oparser_model import get_model -from pypy.jit.metainterp.resoperation import rop, ResOperation, \ - ResOpWithDescr, N_aryOp, \ - UnaryOp, PlainResOp +from pypy.jit.metainterp.resoperation import rop, opclasses, rop_lowercase,\ + ResOpWithDescr, N_aryOp, UnaryOp, PlainResOp, create_resop_dispatch,\ + ResOpNone +from pypy.rpython.lltypesystem import lltype, llmemory class ParseError(Exception): pass -class ESCAPE_OP(N_aryOp, ResOpWithDescr): +class ESCAPE_OP(N_aryOp, ResOpNone, ResOpWithDescr): OPNUM = -123 @@ -28,7 +29,7 @@ def clone(self): return ESCAPE_OP(self.OPNUM, self.getarglist()[:], self.result, self.getdescr()) -class FORCE_SPILL(UnaryOp, PlainResOp): +class FORCE_SPILL(UnaryOp, ResOpNone, PlainResOp): OPNUM = -124 @@ -184,6 +185,17 @@ self.newvar(arg) return self.vars[arg] + def _example_for(self, opnum): + kind = opclasses[opnum].type + if kind == 'i': + return 0 + elif kind == 'f': + return 0.0 + elif kind == 'r': + return lltype.nullptr(llmemory.GCREF.TO) + else: + return None + def parse_args(self, opname, argspec): args = [] descr = None @@ -210,7 +222,7 @@ raise ParseError("invalid line: %s" % line) opname = line[:num] try: - opnum = getattr(rop, opname.upper()) + opnum = getattr(rop_lowercase, opname) except AttributeError: if opname == 'escape': opnum = ESCAPE_OP.OPNUM @@ -255,13 +267,13 @@ return opnum, args, descr, fail_args - def create_op(self, opnum, args, result, descr): + def create_op(self, opnum, result, args, descr): if opnum == ESCAPE_OP.OPNUM: return ESCAPE_OP(opnum, args, result, descr) if opnum == FORCE_SPILL.OPNUM: return FORCE_SPILL(opnum, args, result, descr) else: - return ResOperation(opnum, args, result, descr) + return create_resop_dispatch(opnum, result, args, descr) def parse_result_op(self, line): res, op = line.split("=", 1) @@ -270,16 +282,15 @@ opnum, args, descr, fail_args = self.parse_op(op) if res in self.vars: raise ParseError("Double assign to var %s in line: %s" % (res, line)) - rvar = self.box_for_var(res) - self.vars[res] = rvar - res = self.create_op(opnum, args, rvar, descr) + opres = self.create_op(opnum, self._example_for(opnum), args, descr) + self.vars[res] = opres if fail_args is not None: res.setfailargs(fail_args) - return res + return opres def parse_op_no_result(self, line): opnum, args, descr, fail_args = self.parse_op(line) - res = self.create_op(opnum, args, None, descr) + res = self.create_op(opnum, self._example_for(opnum), args, descr) if fail_args is not None: res.setfailargs(fail_args) return res diff --git a/pypy/jit/tool/oparser_model.py b/pypy/jit/tool/oparser_model.py --- a/pypy/jit/tool/oparser_model.py +++ b/pypy/jit/tool/oparser_model.py @@ -67,6 +67,9 @@ Box._counter += 1 return self._str + def is_constant(self): + return False + class BoxInt(Box): type = 'i' @@ -83,6 +86,9 @@ def _get_str(self): return str(self.value) + def is_constant(self): + return True + class ConstInt(Const): pass @@ -122,31 +128,26 @@ else: model = get_real_model() - class ExtendedTreeLoop(model.TreeLoop): + #class ExtendedTreeLoop(model.TreeLoop): - def getboxes(self): - def opboxes(operations): - for op in operations: - yield op.result - for box in op.getarglist(): - yield box - def allboxes(): - for box in self.inputargs: - yield box - for box in opboxes(self.operations): - yield box + # def getboxes(self): + # def allboxes(): + # for box in self.inputargs: + # yield box + # for op in self.operations: + # yield op - boxes = Boxes() - for box in allboxes(): - if isinstance(box, model.Box): - name = str(box) - setattr(boxes, name, box) - return boxes + # boxes = Boxes() + # for box in allboxes(): + # if isinstance(box, model.Box): + # name = str(box) + # setattr(boxes, name, box) + # return boxes - def setvalues(self, **kwds): - boxes = self.getboxes() - for name, value in kwds.iteritems(): - getattr(boxes, name).value = value + # def setvalues(self, **kwds): + # boxes = self.getboxes() + # for name, value in kwds.iteritems(): + # getattr(boxes, name).value = value - model.ExtendedTreeLoop = ExtendedTreeLoop + model.ExtendedTreeLoop = model.TreeLoop return model diff --git a/pypy/jit/tool/test/test_oparser.py b/pypy/jit/tool/test/test_oparser.py --- a/pypy/jit/tool/test/test_oparser.py +++ b/pypy/jit/tool/test/test_oparser.py @@ -48,7 +48,7 @@ x = """ [p0] - i1 = getfield_gc(p0, descr=stuff) + i1 = getfield_gc_i(p0, descr=stuff) """ stuff = Xyz() loop = self.parse(x, None, locals()) @@ -79,12 +79,14 @@ x = """ [i42] i50 = int_add(i42, 1) + i51 = int_add(i50, 1) """ loop = self.parse(x, None, {}) assert str(loop.inputargs[0]) == 'i42' - assert str(loop.operations[0].result) == 'i50' + assert loop.operations[1].getarg(0) is loop.operations[0] def test_getboxes(self): + py.test.skip("what is it?") x = """ [i0] i1 = int_add(i0, 10) @@ -95,6 +97,7 @@ assert boxes.i1 is loop.operations[0].result def test_setvalues(self): + py.test.skip("what is it?") x = """ [i0] i1 = int_add(i0, 10) @@ -107,7 +110,7 @@ def test_getvar_const_ptr(self): x = ''' [] - call(ConstPtr(func_ptr)) + call_n(ConstPtr(func_ptr)) ''' TP = lltype.GcArray(lltype.Signed) NULL = lltype.cast_opaque_ptr(llmemory.GCREF, lltype.nullptr(TP)) @@ -168,7 +171,7 @@ loop = self.parse(x) # assert did not explode - example_loop_log = '''\ + example_loop_log = """\ # bridge out of Guard12, 6 ops [i0, i1, i2] i4 = int_add(i0, 2) @@ -177,7 +180,7 @@ guard_true(i8, descr=<Guard15>) [i4, i6] debug_merge_point('(no jitdriver.get_printable_location!)', 0) jump(i6, i4, descr=<Loop0>) - ''' + """ def test_parse_no_namespace(self): loop = self.parse(self.example_loop_log, no_namespace=True) @@ -239,6 +242,7 @@ OpParser = OpParser def test_boxkind(self): + py.test.skip("what's that?") x = """ [sum0] """ _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit