Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r78441:60495ed32c01
Date: 2015-07-05 18:07 +0200
http://bitbucket.org/pypy/pypy/changeset/60495ed32c01/

Log:    start writing direct tests of short preamble support

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
@@ -103,19 +103,6 @@
 
 # ____________________________________________________________
 
-class Memo(object):
-    def __init__(self, initial_args=None, initial_res=None):
-        self.snapshots = {}
-        self.box_mapping = {}
-        if initial_args is not None:
-            for i in range(len(initial_args)):
-                self.box_mapping[initial_args[i]] = initial_res[i]
-
-    def get(self, box, default):
-        return self.box_mapping.get(box, default)
-
-    def set(self, box, newbox):
-        self.box_mapping[box] = newbox
 
 def compile_loop(metainterp, greenkey, start,
                  inputargs, jumpargs,
diff --git a/rpython/jit/metainterp/optimizeopt/pure.py 
b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -221,10 +221,11 @@
         ops = sb.optimizer._newoperations
         for i, op in enumerate(ops):
             if op.is_always_pure():
-                sb.add_potential(op, op)
+                sb.add_potential(op)
             if op.is_ovf() and ops[i + 1].getopnum() == rop.GUARD_NO_OVERFLOW:
-                sb.add_potential(op, op)
+                sb.add_potential(op)
         for i in self.call_pure_positions:
+            yyy
             op = ops[i]
             assert op.getopnum() == rop.CALL
             op = op.copy_and_change(rop.CALL_PURE)
diff --git a/rpython/jit/metainterp/optimizeopt/shortpreamble.py 
b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
@@ -0,0 +1,118 @@
+
+from rpython.jit.metainterp.resoperation import rop, ResOperation
+from rpython.jit.metainterp.history import Const
+
+class BoxNotProducable(Exception):
+    pass
+
+
+class ShortBoxes(object):
+    def __init__(self):
+        self.potential_ops = {}
+        self.inputarg_boxes = {}
+        self.synthetic = {}
+        self.alternatives = {}
+        self.extra_same_as = []
+
+    def create_short_boxes(self, optimizer, inputargs):
+        for box in inputargs:
+            self.inputarg_boxes[box] = None
+        optimizer.produce_potential_short_preamble_ops(self)
+
+        self.short_boxes = {}
+        self.short_boxes_in_production = {}
+
+        for op in self.potential_ops.keys():
+            try:
+                self.produce_short_preamble_op(op)
+            except BoxNotProducable:
+                pass
+
+        self.short_boxes_in_production = None # Not needed anymore
+
+    def prioritized_alternatives(self, box):
+        if box not in self.alternatives:
+            return [self.potential_ops[box]]
+        alts = self.alternatives[box]
+        hi, lo = 0, len(alts) - 1
+        while hi < lo:
+            if alts[lo] is None: # Inputarg, lowest priority
+                alts[lo], alts[-1] = alts[-1], alts[lo]
+                lo -= 1
+            elif alts[lo] not in self.synthetic: # Hi priority
+                alts[hi], alts[lo] = alts[lo], alts[hi]
+                hi += 1
+            else: # Low priority
+                lo -= 1
+        return alts
+
+    def add_to_short(self, op):
+        if op in self.short_boxes:
+            xxx
+            #if op is None:
+            #    xxx
+            #    oldop = self.short_boxes[box]
+            #    self.rename[op] = oldop
+            #    self.short_boxes[box] = None
+            #    self.short_boxes[oldop] = oldop
+            #else:
+            #    xxxx
+            #    newop = op.clone()
+            #    newbox = newop.result = op.result.clonebox()
+            #    self.short_boxes[newop.result] = newop
+            #xxx
+            #value = self.optimizer.getvalue(box)
+            #self.optimizer.emit_operation(ResOperation(rop.SAME_AS, [box], 
newbox))
+            #self.optimizer.make_equal_to(newbox, value)
+            #if op is None:
+            #    if self.short_boxes[box] is not box:
+            #        xxx
+            #else:
+            #    if self.short_boxes[box] is not op:
+            #        if self.short_boxes[box] is None:
+            #            self.short_boxes[box] = op
+            #        else:
+            #            xxx
+        else:
+            self.short_boxes[op] = None
+
+    def produce_short_preamble_op(self, op):
+        if op in self.short_boxes:
+            return
+        if op in self.inputarg_boxes:
+            return
+        if isinstance(op, Const):
+            return
+        if op in self.short_boxes_in_production:
+            raise BoxNotProducable
+        self.short_boxes_in_production[op] = None
+
+        if op in self.potential_ops:
+            ops = self.prioritized_alternatives(op)
+            produced_one = False
+            for newop in ops:
+                try:
+                    if newop:
+                        for arg in newop.getarglist():
+                            self.produce_short_preamble_op(arg)
+                except BoxNotProducable:
+                    pass
+                else:
+                    produced_one = True
+                    self.add_to_short(newop)
+            if not produced_one:
+                raise BoxNotProducable
+        else:
+            raise BoxNotProducable
+
+    def add_potential(self, op, result=None, synthetic=False):
+        if result is None:
+            result = op
+        if result in self.potential_ops:
+            if result not in self.alternatives:
+                self.alternatives[result] = [self.potential_ops[result]]
+            self.alternatives[result].append(op)
+        else:
+            self.potential_ops[result] = op
+        if synthetic:
+            self.synthetic[result] = True
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_short.py 
b/rpython/jit/metainterp/optimizeopt/test/test_short.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/metainterp/optimizeopt/test/test_short.py
@@ -0,0 +1,48 @@
+
+""" Short preamble tests
+"""
+
+from rpython.jit.metainterp.resoperation import InputArgInt, ResOperation, rop
+from rpython.jit.metainterp.optimizeopt.shortpreamble import ShortBoxes
+from rpython.jit.metainterp.history import AbstractDescr
+
+class Descr(AbstractDescr):
+    pass
+
+class Opt(object):
+    def __init__(self, oplist):
+        self.oplist = oplist
+    
+    def produce_potential_short_preamble_ops(self, sb):
+        for op in self.oplist:
+            if isinstance(op, tuple):
+                op, r = op
+            else:
+                op, r = op, op
+            sb.add_potential(op, r)
+
+class TestShortBoxes(object):
+    def test_pure_ops(self):
+        i0 = InputArgInt()
+        i1 = InputArgInt()
+        op = ResOperation(rop.INT_ADD, [i0, i1])
+        sb = ShortBoxes()
+        sb.create_short_boxes(Opt([op]), [i0, i1])
+        assert sb.short_boxes == {op: None}
+
+    def test_pure_ops_does_not_work(self):
+        i0 = InputArgInt()
+        i1 = InputArgInt()
+        op = ResOperation(rop.INT_ADD, [i0, i1])
+        sb = ShortBoxes()
+        sb.create_short_boxes(Opt([op]), [i0])
+        assert sb.short_boxes == {}
+
+    def test_multiple_similar_ops(self):
+        i0 = InputArgInt()
+        i1 = InputArgInt()
+        op = ResOperation(rop.INT_ADD, [i0, i1])
+        op1 = ResOperation(rop.GETFIELD_GC_I, [i0], descr=Descr())
+        sb = ShortBoxes()
+        sb.create_short_boxes(Opt([op, (op1, op)]), [i0, i1])
+        
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py 
b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
@@ -4,11 +4,11 @@
 
 from rpython.jit.metainterp.optimizeopt.test.test_util import BaseTest,\
      LLtypeMixin, FakeMetaInterpStaticData
-from rpython.jit.metainterp.history import (TreeLoop, AbstractDescr,
+from rpython.jit.metainterp.history import (TreeLoop, AbstractDescr, ConstInt,
                                             JitCellToken, TargetToken)
 from rpython.jit.metainterp.resoperation import rop, ResOperation
 from rpython.jit.metainterp.optimizeopt.virtualstate import \
-     NotVirtualStateInfo, LEVEL_CONSTANT
+     NotVirtualStateInfo, LEVEL_CONSTANT, LEVEL_UNKNOWN
 
 class FakeOptimizer(object):
     optearlyforce = None
@@ -38,7 +38,7 @@
         start_state = self._do_optimize_loop(preamble, None,
                                              export_state=True)
         vs = preamble.operations[-1].getdescr().virtual_state
-        return start_state, vs
+        return start_state, vs, loop
 
     def test_simple(self):
         loop = """
@@ -47,7 +47,22 @@
         guard_value(i1, 1) []
         jump(i1)
         """
-        es, vs = self.optimize(loop)
+        es, vs, loop = self.optimize(loop)
         assert isinstance(vs.state[0], NotVirtualStateInfo)
+        # the virtual state is constant, so we don't need to have it in
+        # inputargs
         assert vs.make_inputargs([1], FakeOptimizer()) == []
         assert vs.state[0].level == LEVEL_CONSTANT
+        # we have exported values for i1, which happens to be an inputarg
+        assert es.inputarg_mapping[0][1].getint() == 1
+        assert isinstance(es.inputarg_mapping[0][1], ConstInt)
+
+    def test_not_constant(self):
+        loop = """
+        [i0]
+        i1 = int_add(i0, 1)
+        jump(i0)
+        """
+        es, vs, loop = self.optimize(loop)
+        assert isinstance(vs.state[0], NotVirtualStateInfo)
+        assert vs.state[0].level == LEVEL_UNKNOWN
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py 
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -464,7 +464,6 @@
         assert loop.operations[0].getopnum() == rop.LABEL
         loop.inputargs = loop.operations[0].getarglist()
 
-        start_state.orig_inputargs = inputargs
         self._do_optimize_loop(loop, call_pure_results, start_state,
                                export_state=False)
         extra_same_as = []
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py 
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -1,6 +1,5 @@
 import sys
 
-from rpython.jit.metainterp.compile import Memo
 from rpython.jit.metainterp.history import TargetToken, JitCellToken, Const
 from rpython.jit.metainterp.logger import LogOperations
 from rpython.jit.metainterp.optimize import InvalidLoop
@@ -8,10 +7,9 @@
 from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer,\
      Optimization
 from rpython.jit.metainterp.optimizeopt.virtualstate import 
(VirtualStateConstructor,
-        ShortBoxes, BadVirtualState, VirtualStatesCantMatch)
+        BadVirtualState, VirtualStatesCantMatch)
 from rpython.jit.metainterp.resoperation import rop, ResOperation,\
      OpHelpers, AbstractInputArg, GuardResOp, AbstractResOp
-from rpython.jit.metainterp.resume import Snapshot
 from rpython.jit.metainterp import compile
 from rpython.rlib.debug import debug_print, debug_start, debug_stop
 
@@ -44,12 +42,6 @@
         self.emitting_dissabled = False
         self.emitted_guards = 0
 
-    def ensure_imported(self, value):
-        if not self.emitting_dissabled and value in self.importable_values:
-            imp = self.importable_values[value]
-            del self.importable_values[value]
-            imp.import_value(value)
-
     def emit_operation(self, op):
         if self.emitting_dissabled:
             return
@@ -82,21 +74,14 @@
         modifier = VirtualStateConstructor(self.optimizer)
         return modifier.get_virtual_state(args)
 
-    def fix_snapshot(self, jump_args, snapshot):
-        if snapshot is None:
-            return None
-        snapshot_args = snapshot.boxes
-        new_snapshot_args = []
-        for a in snapshot_args:
-            a = self.getvalue(a).get_key_box()
-            new_snapshot_args.append(a)
-        prev = self.fix_snapshot(jump_args, snapshot.prev)
-        return Snapshot(prev, new_snapshot_args)
-
     def propagate_all_forward(self, starting_state, export_state=True):
         self.optimizer.exporting_state = export_state
         loop = self.optimizer.loop
         self.optimizer.clear_newoperations()
+        for op in loop.operations:
+            assert op.get_forwarded() is None
+        for op in loop.inputargs:
+            assert op.get_forwarded() is None
 
         start_label = loop.operations[0]
         if start_label.getopnum() == rop.LABEL:
@@ -220,30 +205,30 @@
 
     def export_state(self, targetop):
         original_jump_args = targetop.getarglist()
+        label_op = self.optimizer.loop.operations[0]
         jump_args = [self.get_box_replacement(a) for a in original_jump_args]
+        virtual_state = self.get_virtual_state(jump_args)
+        target_token = targetop.getdescr()
+        assert isinstance(target_token, TargetToken)
+        target_token.virtual_state = virtual_state
+        return ExportedState([(label_op.getarg(i), jump_args[i]) for i in 
range(len(jump_args))], [], [], [])
+        xxx
 
-        virtual_state = self.get_virtual_state(jump_args)
 
         inputargs = virtual_state.make_inputargs(jump_args, self.optimizer)
         short_inputargs = virtual_state.make_inputargs(jump_args,
                                             self.optimizer, keyboxes=True)
 
-        if self.boxes_created_this_iteration is not None:
-            for box in self.inputargs:
-                self.boxes_created_this_iteration[box] = None
-
-        short_boxes = ShortBoxes(self.optimizer, inputargs)
-
-        proven_constants = []
-        for i in range(len(original_jump_args)):
-            srcbox = jump_args[i]
-            if srcbox is not original_jump_args[i]:
-                if srcbox.type == 'r':
-                    info = self.optimizer.getptrinfo(srcbox)
-                    if info and info.is_virtual():
-                        xxx
-            if original_jump_args[i] is not srcbox and srcbox.is_constant():
-                proven_constants.append((original_jump_args[i], srcbox))
+        #proven_constants = []
+        #for i in range(len(original_jump_args)):
+        #    srcbox = jump_args[i]
+        ##    if srcbox is not original_jump_args[i]:
+        #        if srcbox.type == 'r':
+        #            info = self.optimizer.getptrinfo(srcbox)
+        #            if info and info.is_virtual():
+        #                xxx
+        #    if original_jump_args[i] is not srcbox and srcbox.is_constant():
+        #        proven_constants.append((original_jump_args[i], srcbox))
                 #opnum = OpHelpers.same_as_for_type(original_jump_args[i].type)
                 #op = ResOperation(opnum, [srcbox])
                 #self.optimizer.emit_operation(op)
@@ -263,20 +248,16 @@
         #inputarg_setup_ops = original_jump_args
         #inputarg_setup_ops = self.optimizer.get_newoperations()
 
-        target_token = targetop.getdescr()
-        assert isinstance(target_token, TargetToken)
-        targetop.initarglist(inputargs)
-        target_token.virtual_state = virtual_state
         target_token.short_preamble = [ResOperation(rop.LABEL, 
short_inputargs, None)]
 
-        exported_values = {}
-        for box in inputargs:
-            exported_values[box] = self.optimizer.getinfo(box)
-        for op in short_boxes.operations():
-            if op and op.type != 'v':
-                exported_values[op] = self.optimizer.getinfo(op)
+        #exported_values = {}
+        #for box in inputargs:
+        #    exported_values[box] = self.optimizer.getinfo(box)
+        #for op in short_boxes.operations():
+        #    if op and op.type != 'v':
+        #        exported_values[op] = self.optimizer.getinfo(op)
 
-        return ExportedState(short_boxes, proven_constants, exported_values)
+        return ExportedState([], [])
 
     def import_state(self, targetop, exported_state):
         if not targetop: # Trace did not start with a label
@@ -295,21 +276,20 @@
             self.initial_virtual_state = virtual_state
             return
 
-        self.short = target_token.short_preamble[:]
-        self.short_seen = {}
-        self.short_boxes = exported_state.short_boxes
+        self.short = [] # target_token.short_preamble[:]
+        #self.short_seen = {}
         self.initial_virtual_state = target_token.virtual_state
 
-        inpargs = self.initial_virtual_state.make_inputargs(
-            exported_state.orig_inputargs, self.optimizer)
-        for i, arg in enumerate(inpargs):
-            if arg is not self.inputargs[i]:
-                arg.set_forwarded(self.inputargs[i])
-        for box in self.inputargs:
-            preamble_info = exported_state.exported_values[box]
-            self.optimizer.setinfo_from_preamble(box, preamble_info)
-        for box, const in exported_state.proven_constants:
-            box.set_forwarded(const)
+        #inpargs = self.initial_virtual_state.make_inputargs(
+        #    exported_state.orig_inputargs, self.optimizer)
+        #for i, arg in enumerate(inpargs):
+        #    if arg is not self.inputargs[i]:
+        #        arg.set_forwarded(self.inputargs[i])
+        #for box in self.inputargs:
+        #    preamble_info = exported_state.exported_values[box]
+        #    self.optimizer.setinfo_from_preamble(box, preamble_info)
+        #for box, const in exported_state.state:
+        #    box.set_forwarded(const)
 
         # Setup the state of the new optimizer by emiting the
         # short operations and discarding the result
@@ -318,14 +298,14 @@
         #for source, target in exported_state.inputarg_setup_ops:
         #    source.set_forwarded(target)
 
-        for op in self.short_boxes.operations():
-            if not op:
-                continue
-            if op.is_always_pure():
-                self.pure(op.getopnum(),
-                          PreambleOp(op, self.optimizer.getinfo(op)))
-            else:
-                yyy
+        #for op in self.short_boxes.operations():
+        #    if not op:
+        #        continue
+        #    if op.is_always_pure():
+        #        self.pure(op.getopnum(),
+        #                  PreambleOp(op, self.optimizer.getinfo(op)))
+        #    else:
+        #        yyy
         return
         seen = {}
         for op in self.short_boxes.operations():
@@ -717,23 +697,30 @@
                                       'it has at the start of the target loop')
             i += 1
 
-
-class ValueImporter(object):
-    def __init__(self, unroll, value, op):
-        self.unroll = unroll
-        self.preamble_value = value
-        self.op = op
-
-    def import_value(self, value):
-        value.import_from(self.preamble_value, self.unroll.optimizer)
-        self.unroll.add_op_to_short(self.op, False, True)
-
+class ShortPreambleBuilder(object):
+    """ A place that builds short preamble and the necessary
+    arguments for the label and the jump
+    """
 
 class ExportedState(object):
-    def __init__(self, short_boxes, proven_constants, exported_values):
-        self.short_boxes = short_boxes
-        self.proven_constants = proven_constants
-        self.exported_values = exported_values
+    """ Exported state consists of a few pieces of information:
+
+    * inputarg_mapping - a list of tuples with original inputarg box
+                         as the first element and the second element being
+                         what it maps to (potentially const)
+    * exported_infos - a mapping from ops to infos, including inputargs
+    * pure operations - a list of pure operations that can produce various
+                        ops
+    * heap cache operations - an additional list of how to produce various
+                              ops
+    """
+    
+    def __init__(self, inputarg_mapping, exported_infos, pure_ops,
+                 heap_cache_ops):
+        self.inputarg_mapping = inputarg_mapping
+        self.exported_infos = exported_infos
+        self.pure_ops = pure_ops
+        self.heap_cache_ops = heap_cache_ops
 
     def dump(self, metainterp_sd):
         debug_start("jit-exported-state")
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py 
b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -5,12 +5,12 @@
 from rpython.jit.metainterp.optimizeopt.intutils import IntUnbounded
 from rpython.jit.metainterp.resoperation import rop, ResOperation,\
      AbstractInputArg
-from rpython.jit.metainterp.compile import Memo
 from rpython.rlib.debug import debug_start, debug_stop, debug_print
 from rpython.rlib.objectmodel import we_are_translated
 
 LEVEL_UNKNOWN = '\x00'
-LEVEL_CONSTANT = '\x01'
+LEVEL_NONNULL = '\x01'
+LEVEL_CONSTANT = '\x02'
 
 class BadVirtualState(Exception):
     pass
@@ -286,6 +286,8 @@
         info = optimizer.getinfo(box)
         if info and info.is_constant():
             self.level = LEVEL_CONSTANT
+        elif box.type == 'r' and info and info.is_nonnull():
+            self.level = LEVEL_NONNULL
         else:
             self.level = LEVEL_UNKNOWN
         return
@@ -617,172 +619,3 @@
     def visit_varraystruct(self, arraydescr, fielddescrs):
         return VArrayStructStateInfo(arraydescr, fielddescrs)
 
-
-class BoxNotProducable(Exception):
-    pass
-
-
-class ShortBoxes(object):
-    def __init__(self, optimizer, surviving_boxes):
-        self.potential_ops = {}
-        self.alternatives = {}
-        self.synthetic = {}
-        self.optimizer = optimizer
-        self.assumed_classes = {}
-
-        assert surviving_boxes is not None
-        for box in surviving_boxes:
-            self.potential_ops[box] = None
-        optimizer.produce_potential_short_preamble_ops(self)
-
-        self.short_boxes = {}
-        self.short_boxes_in_production = {}
-
-        for op in self.potential_ops.keys():
-            try:
-                self.produce_short_preamble_op(op)
-            except BoxNotProducable:
-                pass
-
-        self.short_boxes_in_production = None # Not needed anymore
-        #else:
-        #    self.short_boxes = {}
-
-    def dump(self, logops):
-        if 0:
-            for op, resop in self.short_boxes.iteritems():
-                if isinstance(op, AbstractInputArg):
-                    assert resop is None
-                    debug_print(logops.repr_of_arg(op))
-                else:
-                    debug_print("%s:%s"% (logops.repr_of_resop(op),
-                                          logops.repr_of_resop(resop)))
-
-    def prioritized_alternatives(self, box):
-        if box not in self.alternatives:
-            return [self.potential_ops[box]]
-        alts = self.alternatives[box]
-        hi, lo = 0, len(alts) - 1
-        while hi < lo:
-            if alts[lo] is None: # Inputarg, lowest priority
-                alts[lo], alts[-1] = alts[-1], alts[lo]
-                lo -= 1
-            elif alts[lo] not in self.synthetic: # Hi priority
-                alts[hi], alts[lo] = alts[lo], alts[hi]
-                hi += 1
-            else: # Low priority
-                lo -= 1
-        return alts
-
-    def add_to_short(self, box, op):
-        if box in self.short_boxes:
-            xxx
-            return # XXX avoid those corner cases
-            #if op is None:
-            #    xxx
-            #    oldop = self.short_boxes[box]
-            #    self.rename[op] = oldop
-            #    self.short_boxes[box] = None
-            #    self.short_boxes[oldop] = oldop
-            #else:
-            #    xxxx
-            #    newop = op.clone()
-            #    newbox = newop.result = op.result.clonebox()
-            #    self.short_boxes[newop.result] = newop
-            #xxx
-            #value = self.optimizer.getvalue(box)
-            #self.optimizer.emit_operation(ResOperation(rop.SAME_AS, [box], 
newbox))
-            #self.optimizer.make_equal_to(newbox, value)
-            #if op is None:
-            #    if self.short_boxes[box] is not box:
-            #        xxx
-            #else:
-            #    if self.short_boxes[box] is not op:
-            #        if self.short_boxes[box] is None:
-            #            self.short_boxes[box] = op
-            #        else:
-            #            xxx
-            if op is None:
-                oldop = self.short_boxes[box].clone()
-                oldres = oldop.result
-                newbox = oldop.result = oldres.clonebox()
-                self.rename[box] = newbox
-                self.short_boxes[box] = None
-                self.short_boxes[newbox] = oldop
-            else:
-                newop = op.clone()
-                newbox = newop.result = op.result.clonebox()
-                self.short_boxes[newop.result] = newop
-            value = self.optimizer.getvalue(box)
-            self.optimizer.emit_operation(ResOperation(rop.SAME_AS, [box], 
newbox))
-            self.optimizer.make_equal_to(newbox, value)
-        else:
-            self.short_boxes[box] = op
-
-    def produce_short_preamble_op(self, op):
-        if op in self.short_boxes:
-            return
-        if isinstance(op, Const):
-            return
-        if op in self.short_boxes_in_production:
-            raise BoxNotProducable
-        self.short_boxes_in_production[op] = None
-
-        if op in self.potential_ops:
-            ops = self.prioritized_alternatives(op)
-            produced_one = False
-            for newop in ops:
-                try:
-                    if newop:
-                        for arg in newop.getarglist():
-                            self.produce_short_preamble_op(arg)
-                except BoxNotProducable:
-                    pass
-                else:
-                    produced_one = True
-                    self.add_to_short(op, newop)
-            if not produced_one:
-                raise BoxNotProducable
-        else:
-            raise BoxNotProducable
-
-    def add_potential(self, key, op, synthetic=False):
-        #try:
-        #    value = self.optimizer.values[key]
-        #    if value in self.optimizer.opaque_pointers:
-        #        classbox = value.get_constant_class(self.optimizer.cpu)
-        #        if classbox:
-        #            self.assumed_classes[key] = classbox
-        #except KeyError:
-        #    pass
-        if key not in self.potential_ops:
-            self.potential_ops[key] = op
-        else:
-            if key not in self.alternatives:
-                self.alternatives[key] = [self.potential_ops[key]]
-            self.alternatives[key].append(op)
-        if synthetic:
-            self.synthetic[op] = True
-
-    def debug_print(self, logops):
-        if 0:
-            debug_start('jit-short-boxes')
-            for box, op in self.short_boxes.items():
-                if op:
-                    debug_print(logops.repr_of_arg(box) + ': ' + 
logops.repr_of_resop(op))
-                else:
-                    debug_print(logops.repr_of_arg(box) + ': None')
-            debug_stop('jit-short-boxes')
-
-    def operations(self):
-        if not we_are_translated(): # For tests
-            ops = self.short_boxes.values()
-            ops.sort(key=str, reverse=True)
-            return ops
-        return self.short_boxes.values()
-
-    def producer(self, box):
-        return self.short_boxes[box]
-
-    def has_producer(self, box):
-        return box in self.short_boxes
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to