Author: Maciej Fijalkowski <[email protected]>
Branch: result-in-resops
Changeset: r57406:3920f1a8b8b2
Date: 2012-09-20 16:32 +0200
http://bitbucket.org/pypy/pypy/changeset/3920f1a8b8b2/

Log:    remove inliner and start hacking on unrolling

diff --git a/TODO b/TODO
new file mode 100644
--- /dev/null
+++ b/TODO
@@ -0,0 +1,2 @@
+
+* make OptValue somehow leaner using subclassing instead of one-size-fit-most
diff --git a/pypy/jit/metainterp/compile.py b/pypy/jit/metainterp/compile.py
--- a/pypy/jit/metainterp/compile.py
+++ b/pypy/jit/metainterp/compile.py
@@ -12,9 +12,8 @@
 from pypy.jit.metainterp.history import TreeLoop, JitCellToken, TargetToken
 from pypy.jit.metainterp.history import AbstractFailDescr
 from pypy.jit.metainterp.resoperation import BoxPtr, BoxFloat, Box, BoxInt
-from pypy.jit.metainterp import history, resoperation
+from pypy.jit.metainterp import resoperation
 from pypy.jit.metainterp.optimize import InvalidLoop
-from pypy.jit.metainterp.inliner import Inliner
 from pypy.jit.metainterp.resume import NUMBERING, PENDINGFIELDSP
 from pypy.jit.codewriter import heaptracker, longlong
 
@@ -408,18 +407,18 @@
 
 class DoneWithThisFrameDescrVoid(_DoneWithThisFrameDescr):
     def handle_fail(self, metainterp_sd, jitdriver_sd):
-        assert jitdriver_sd.result_type == history.VOID
+        assert jitdriver_sd.result_type == resoperation.VOID
         raise metainterp_sd.DoneWithThisFrameVoid()
 
 class DoneWithThisFrameDescrInt(_DoneWithThisFrameDescr):
     def handle_fail(self, metainterp_sd, jitdriver_sd):
-        assert jitdriver_sd.result_type == history.INT
+        assert jitdriver_sd.result_type == resoperation.INT
         result = metainterp_sd.cpu.get_latest_value_int(0)
         raise metainterp_sd.DoneWithThisFrameInt(result)
 
 class DoneWithThisFrameDescrRef(_DoneWithThisFrameDescr):
     def handle_fail(self, metainterp_sd, jitdriver_sd):
-        assert jitdriver_sd.result_type == history.REF
+        assert jitdriver_sd.result_type == resoperation.REF
         cpu = metainterp_sd.cpu
         result = cpu.get_latest_value_ref(0)
         cpu.clear_latest_values(1)
@@ -427,7 +426,7 @@
 
 class DoneWithThisFrameDescrFloat(_DoneWithThisFrameDescr):
     def handle_fail(self, metainterp_sd, jitdriver_sd):
-        assert jitdriver_sd.result_type == history.FLOAT
+        assert jitdriver_sd.result_type == resoperation.FLOAT
         result = metainterp_sd.cpu.get_latest_value_float(0)
         raise metainterp_sd.DoneWithThisFrameFloat(result)
 
@@ -505,11 +504,11 @@
         else:
             if i > self.CNT_BASE_MASK:
                 return    # probably never, but better safe than sorry
-            if box.type == history.INT:
+            if box.type == resoperation.INT:
                 cnt = self.CNT_INT
-            elif box.type == history.REF:
+            elif box.type == resoperation.REF:
                 cnt = self.CNT_REF
-            elif box.type == history.FLOAT:
+            elif box.type == resoperation.FLOAT:
                 cnt = self.CNT_FLOAT
             else:
                 assert 0, box.type
@@ -838,9 +837,9 @@
     assert len(redargtypes) == nb_red_args
     inputargs = []
     for kind in redargtypes:
-        if   kind == history.INT:   box = BoxInt()
-        elif kind == history.REF:   box = BoxPtr()
-        elif kind == history.FLOAT: box = BoxFloat()
+        if   kind == resoperation.INT:   box = BoxInt()
+        elif kind == resoperation.REF:   box = BoxPtr()
+        elif kind == resoperation.FLOAT: box = BoxFloat()
         else: raise AssertionError
         inputargs.append(box)
     k = jitdriver_sd.portal_runner_adr
diff --git a/pypy/jit/metainterp/inliner.py b/pypy/jit/metainterp/inliner.py
deleted file mode 100644
--- a/pypy/jit/metainterp/inliner.py
+++ /dev/null
@@ -1,46 +0,0 @@
-
-from pypy.jit.metainterp.resoperation import Const
-from pypy.jit.metainterp.resume import Snapshot
-
-class Inliner(object):
-    def __init__(self, inputargs, jump_args):
-        assert len(inputargs) == len(jump_args)
-        self.argmap = {}
-        for i in range(len(inputargs)):
-            if inputargs[i] in self.argmap:
-                assert self.argmap[inputargs[i]] == jump_args[i]
-            else:
-                self.argmap[inputargs[i]] = jump_args[i]
-        self.snapshot_map = {None: None}
-
-    def inline_op(self, op):
-        newop = op.copy_if_modified_by_optimization(self, force_copy=True)
-        if newop.is_guard():
-            args = op.getfailargs()
-            if args:
-                newop.setfailargs([self.get_value_replacement(a) for a in 
args])
-
-        self.argmap[op] = newop
-        self.inline_descr_inplace(newop.getdescr())
-        return newop
-
-    def inline_descr_inplace(self, descr):
-        from pypy.jit.metainterp.compile import ResumeGuardDescr
-        if isinstance(descr, ResumeGuardDescr):
-            descr.rd_snapshot = self.inline_snapshot(descr.rd_snapshot)
-
-    def get_value_replacement(self, arg):
-        if arg is None:
-            return None
-        if isinstance(arg, Const):
-            return arg
-        return self.argmap[arg]
-
-    def inline_snapshot(self, snapshot):
-        if snapshot in self.snapshot_map:
-            return self.snapshot_map[snapshot]
-        boxes = [self.get_value_replacement(a) for a in snapshot.boxes]
-        new_snapshot = Snapshot(self.inline_snapshot(snapshot.prev), boxes)
-        self.snapshot_map[snapshot] = new_snapshot
-        return new_snapshot
-
diff --git a/pypy/jit/metainterp/optimizeopt/generalize.py 
b/pypy/jit/metainterp/optimizeopt/generalize.py
--- a/pypy/jit/metainterp/optimizeopt/generalize.py
+++ b/pypy/jit/metainterp/optimizeopt/generalize.py
@@ -9,6 +9,7 @@
 
 class KillHugeIntBounds(GeneralizationStrategy):
     def apply(self):
+        return # so far we don't care
         for v in self.optimizer.values.values():
             if v.is_constant():
                 continue
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
@@ -31,12 +31,7 @@
         b = v.intbound
         if b.has_lower and b.has_upper and b.lower == b.upper:
             v.make_constant(ConstInt(b.lower))
-
-        try:
-            op = self.optimizer.producer[box]
-        except KeyError:
-            return
-        dispatch_bounds_ops(self, op)
+        dispatch_bounds_ops(self, box)
 
     def optimize_GUARD_TRUE(self, op):
         self.emit_operation(op)
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
@@ -7,8 +7,7 @@
 from pypy.jit.metainterp.optimizeopt.util import make_dispatcher_method
 from pypy.jit.metainterp.resoperation import rop, AbstractResOp, opgroups,\
      Const, ConstInt, ConstFloat
-from pypy.jit.metainterp.typesystem import llhelper, oohelper
-from pypy.tool.pairtype import extendabletype
+from pypy.jit.metainterp.typesystem import llhelper
 from pypy.rlib.objectmodel import specialize
 
 LEVEL_UNKNOWN    = '\x00'
@@ -19,6 +18,7 @@
 MODE_ARRAY   = '\x00'
 MODE_STR     = '\x01'
 MODE_UNICODE = '\x02'
+
 class LenBound(object):
     def __init__(self, mode, descr, bound):
         self.mode = mode
@@ -29,7 +29,6 @@
         return LenBound(self.mode, self.descr, self.bound.clone())
 
 class OptValue(object):
-    __metaclass__ = extendabletype
     _attrs_ = ('box', 'known_class', 'last_guard', 'level', 'intbound', 
'lenbound')
     last_guard = None
 
@@ -401,23 +400,24 @@
         self.resumedata_memo.forget_numberings(virtualbox)
 
     def getinterned(self, box):
+        # WTF is this function doing?
+        if box.type != REF:
+            return box
         constbox = self.get_constant_box(box)
         if constbox is None:
             return box
-        if constbox.type == REF:
-            xxx
-            value = constbox.getref_base()
-            if not value:
-                return box
-            return self.interned_refs.setdefault(value, box)
+        value = constbox.getref_base()
+        if not value:
+            return box
+        return self.interned_refs.setdefault(value, box)
         #elif constbox.type == INT:
         #    value = constbox.getint()
         #    return self.interned_ints.setdefault(value, box)
-        else:
-            return box
 
     @specialize.argtype(0)
     def getvalue(self, box):
+        if box.is_constant():
+            return ConstantValue(box)
         box = self.getinterned(box)
         try:
             value = box.get_extra("optimize_value")
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
@@ -1,12 +1,13 @@
 from pypy.jit.metainterp.optimizeopt.optimizer import Optimization, REMOVED
 from pypy.jit.metainterp.resoperation import rop, create_resop_2
-from pypy.jit.metainterp.optimizeopt.util import make_dispatcher_method
+from pypy.jit.metainterp.optimizeopt.util import make_dispatcher_method,\
+     ArgsDict
 
 class OptPure(Optimization):
     def __init__(self):
         self.posponedop = None
-        self.pure_operations = args_dict()
-        self.emitted_pure_operations = {}
+        self.pure_operations = ArgsDict()
+        self.emitted_pure_operations = []
 
     def propagate_forward(self, op):
         dispatch_opt(self, op)
@@ -37,15 +38,14 @@
                 return
 
             # did we do the exact same operation already?
-            args = self.optimizer.make_args_key(op)
-            oldop = self.pure_operations.get(args, None)
-            if oldop is not None and oldop.getdescr() is op.getdescr():
+            oldop = self.pure_operations.get(op)
+            if oldop is not None:
                 assert oldop.getopnum() == op.getopnum()
                 self.optimizer.make_equal_to(op.result, 
self.getvalue(oldop.result),
                                    True)
                 return
             else:
-                self.pure_operations[args] = op
+                self.pure_operations.add(op)
                 self.remember_emitting_pure(op)
 
         # otherwise, the operation remains
@@ -112,11 +112,13 @@
         return self.pure_operations.get(key, None)
 
     def remember_emitting_pure(self, op):
-        self.emitted_pure_operations[op] = True
+        self.emitted_pure_operations.append(op)
 
     def produce_potential_short_preamble_ops(self, sb):
         for op in self.emitted_pure_operations:
-            if op.getopnum() == rop.GETARRAYITEM_GC_PURE or \
+            if op.getopnum() == rop.GETARRAYITEM_GC_PURE_i or \
+               op.getopnum() == rop.GETARRAYITEM_GC_PURE_p or \
+               op.getopnum() == rop.GETARRAYITEM_GC_PURE_f or \
                op.getopnum() == rop.STRGETITEM or \
                op.getopnum() == rop.UNICODEGETITEM:
                 if not self.getvalue(op.getarg(1)).is_constant():
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_util.py 
b/pypy/jit/metainterp/optimizeopt/test/test_util.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_util.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_util.py
@@ -13,12 +13,11 @@
 from pypy.jit.codewriter.heaptracker import register_known_gctype
 from pypy.jit.tool.oparser import parse, pure_parse
 from pypy.jit.metainterp.quasiimmut import QuasiImmutDescr
-from pypy.jit.metainterp import compile, resume, history
+from pypy.jit.metainterp import compile, resume
 from pypy.jit.metainterp.jitprof import EmptyProfiler
 from pypy.config.pypyoption import get_pypy_config
 from pypy.jit.metainterp.resoperation import rop, create_resop, BoxPtr,\
-     create_resop_0
-from pypy.jit.metainterp.optimizeopt.unroll import Inliner
+     create_resop_0, REF, INT, FLOAT
 
 def test_sort_descrs():
     class PseudoDescr(AbstractDescr):
@@ -76,7 +75,7 @@
     d = ArgsDict()
     op = create_resop_0(rop.FORCE_TOKEN, 13)
     assert d.get(op) is None
-    d.setitem(op)
+    d.add(op)
     assert d.get(op) is op
 
 # ____________________________________________________________
@@ -378,7 +377,7 @@
         return res
 
 def _sortboxes(boxes):
-    _kind2count = {history.INT: 1, history.REF: 2, history.FLOAT: 3}
+    _kind2count = {INT: 1, REF: 2, FLOAT: 3}
     return sorted(boxes, key=lambda box: _kind2count[box.type])
 
 class BaseTest(object):
@@ -407,15 +406,12 @@
         assert equaloplists(optimized.operations,
                             expected.operations, False, remap, text_right)
 
-    def _do_optimize_loop(self, loop):
+    def _do_optimize_loop(self, loop, call_pure_results):
         from pypy.jit.metainterp.optimizeopt import optimize_trace
-        #from pypy.jit.metainterp.optimizeopt.util import args_dict
 
         self.loop = loop
-        #loop.call_pure_results = args_dict()
-        #if call_pure_results is not None:
-        #    for k, v in call_pure_results.items():
-        #        loop.call_pure_results[list(k)] = v
+        if call_pure_results is not None:
+            loop.call_pure_results = call_pure_results.copy()
         metainterp_sd = FakeMetaInterpStaticData(self.cpu)
         if hasattr(self, 'vrefinfo'):
             metainterp_sd.virtualref_info = self.vrefinfo
@@ -424,7 +420,7 @@
         #
         optimize_trace(metainterp_sd, loop, self.enable_opts)
 
-    def unroll_and_optimize(self, loop):#, call_pure_results=None):
+    def unroll_and_optimize(self, loop, call_pure_results=None):
         operations =  loop.operations
         jumpop = operations[-1]
         assert jumpop.getopnum() == rop.JUMP
@@ -443,19 +439,17 @@
                                             operations +  \
                               [create_resop(rop.LABEL, None, jump_args,
                                             descr=token)]
-        self._do_optimize_loop(preamble)#, call_pure_results)
+        self._do_optimize_loop(preamble, call_pure_results)
 
         assert preamble.operations[-1].getopnum() == rop.LABEL
 
-        import pdb
-        pdb.set_trace()
-        inliner = Inliner(inputargs, jump_args)
         loop.resume_at_jump_descr = preamble.resume_at_jump_descr
+        for op in operations:
+            op.del_extra("optimize_value")
+        # deal with jump args
         loop.operations = [preamble.operations[-1]] + \
-                          [inliner.inline_op(op) for op in cloned_operations] 
+ \
-                          [ResOperation(rop.JUMP, [inliner.inline_arg(a) for a 
in jump_args],
-                                        None, descr=token)] 
-                          #[inliner.inline_op(jumpop)]
+                          operations + \
+                          [create_resop(rop.JUMP, None, jump_args, 
descr=token)]
         assert loop.operations[-1].getopnum() == rop.JUMP
         assert loop.operations[0].getopnum() == rop.LABEL
         loop.inputargs = loop.operations[0].getarglist()
diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py 
b/pypy/jit/metainterp/optimizeopt/unroll.py
--- a/pypy/jit/metainterp/optimizeopt/unroll.py
+++ b/pypy/jit/metainterp/optimizeopt/unroll.py
@@ -1,13 +1,10 @@
-from pypy.jit.codewriter.effectinfo import EffectInfo
 from pypy.jit.metainterp.optimizeopt.virtualstate import VirtualStateAdder, 
ShortBoxes, BadVirtualState
 from pypy.jit.metainterp.compile import ResumeGuardDescr
-from pypy.jit.metainterp.history import TreeLoop, TargetToken, JitCellToken
-from pypy.jit.metainterp.jitexc import JitException
+from pypy.jit.metainterp.history import TargetToken, JitCellToken
 from pypy.jit.metainterp.optimize import InvalidLoop
 from pypy.jit.metainterp.optimizeopt.optimizer import *
 from pypy.jit.metainterp.optimizeopt.generalize import KillHugeIntBounds
-from pypy.jit.metainterp.inliner import Inliner
-from pypy.jit.metainterp.resoperation import rop
+from pypy.jit.metainterp.resoperation import rop, create_resop
 from pypy.jit.metainterp.resume import Snapshot
 import sys, os
 
@@ -93,8 +90,7 @@
 
         cell_token = jumpop.getdescr()
         assert isinstance(cell_token, JitCellToken)
-        stop_label = ResOperation(rop.LABEL, jumpop.getarglist(), None, 
TargetToken(cell_token))
-
+        stop_label = create_resop(rop.LABEL, None, jumpop.getarglist(), 
TargetToken(cell_token))
         
         if jumpop.getopnum() == rop.JUMP:
             if self.jump_to_already_compiled_trace(jumpop):
@@ -107,7 +103,7 @@
 
             if start_label and self.jump_to_start_label(start_label, 
stop_label):
                 # Initial label matches, jump to it
-                jumpop = ResOperation(rop.JUMP, stop_label.getarglist(), None,
+                jumpop = create_resop(rop.JUMP, None, stop_label.getarglist(),
                                       descr=start_label.getdescr())
                 if self.short:
                     # Construct our short preamble
@@ -199,7 +195,8 @@
         assert isinstance(target_token, TargetToken)
         targetop.initarglist(inputargs)
         target_token.virtual_state = virtual_state
-        target_token.short_preamble = [ResOperation(rop.LABEL, 
short_inputargs, None)]
+        target_token.short_preamble = [create_resop(rop.LABEL, None,
+                                                    short_inputargs)]
         target_token.resume_at_jump_descr = resume_at_jump_descr
 
         exported_values = {}
diff --git a/pypy/jit/metainterp/optimizeopt/util.py 
b/pypy/jit/metainterp/optimizeopt/util.py
--- a/pypy/jit/metainterp/optimizeopt/util.py
+++ b/pypy/jit/metainterp/optimizeopt/util.py
@@ -107,41 +107,14 @@
             return candidate
         return None
 
-    def setitem(self, op):
+    def add(self, op):
         hash = op._get_hash_() & self.bucket_size
         self.buckets[hash] = op # don't care about collisions
 
-# def args_eq(args1, args2):
-#     make_sure_not_resized(args1)
-#     make_sure_not_resized(args2)
-#     if len(args1) != len(args2):
-#         return False
-#     for i in range(len(args1)):
-#         arg1 = args1[i]
-#         arg2 = args2[i]
-#         if arg1 is None:
-#             if arg2 is not None:
-#                 return False
-#         elif not arg1.same_box(arg2):
-#             return False
-#     return True
-
-# def args_hash(args):
-#     make_sure_not_resized(args)
-#     res = 0x345678
-#     for arg in args:
-#         if arg is None:
-#             y = 17
-#         else:
-#             y = arg._get_hash_()
-#         res = intmask((1000003 * res) ^ y)
-#     return res
-
-# def args_dict():
-#     return r_dict(args_eq, args_hash)
-
-# def args_dict_box():
-#     return r_dict(args_eq, args_hash)
+    def copy(self):
+        a = ArgsDict()
+        a.buckets = self.buckets[:]
+        return a
 
 
 # ____________________________________________________________
diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py 
b/pypy/jit/metainterp/optimizeopt/virtualstate.py
--- a/pypy/jit/metainterp/optimizeopt/virtualstate.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py
@@ -681,6 +681,7 @@
             raise BoxNotProducable
 
     def add_potential(self, op, synthetic=False):
+        return # XXX
         if op.result and op.result in self.optimizer.values:
             value = self.optimizer.values[op.result]
             if value in self.optimizer.opaque_pointers:
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
@@ -585,7 +585,8 @@
 
     @specialize.arg(1)
     def del_extra(self, key):
-        delattr(self, key)
+        if hasattr(self, key):
+            delattr(self, key)
 
     @classmethod
     def getopnum(cls):
@@ -900,6 +901,8 @@
         check_descr(descr)
 
     def get_descr_hash(self):
+        if self._descr is None:
+            return 0 # for tests
         return compute_identity_hash(self._descr)
 
 class GuardResOp(ResOpWithDescr):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to