[pypy-commit] pypy optresult-unroll: start passing construction of args

fijal noreply at buildbot.pypy.org
Mon Jun 29 17:20:11 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r78352:fdaae9ee19c7
Date: 2015-06-29 17:19 +0200
http://bitbucket.org/pypy/pypy/changeset/fdaae9ee19c7/

Log:	start passing construction of args

diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -297,9 +297,15 @@
                 self.make_constant_class(op, known_class, False)
 
     def get_box_replacement(self, op):
+        from rpython.jit.metainterp.optimizeopt.unroll import PreambleOp
+
+        orig_op = op
         if op is None:
             return op
-        return op.get_box_replacement()
+        res = op.get_box_replacement()
+        if isinstance(res, PreambleOp):
+            xxx
+        return res
 
     def force_box(self, op):
         op = self.get_box_replacement(op)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
@@ -1,22 +1,26 @@
 from __future__ import with_statement
 import py
-from rpython.jit.metainterp.optimizeopt.virtualstate import VirtualStateInfo, VStructStateInfo, \
-     VArrayStateInfo, NotVirtualStateInfo, VirtualState, ShortBoxes, GenerateGuardState, \
-     VirtualStatesCantMatch, VArrayStructStateInfo
-from rpython.jit.metainterp.optimizeopt.optimizer import OptValue, PtrOptValue,\
-      IntOptValue
-from rpython.jit.metainterp.history import BoxInt, BoxFloat, BoxPtr, ConstInt, ConstPtr
+from rpython.jit.metainterp.optimizeopt.virtualstate import VirtualStateInfo,\
+     VStructStateInfo, LEVEL_CONSTANT,\
+     VArrayStateInfo, NotVirtualStateInfo, VirtualState, ShortBoxes,\
+     GenerateGuardState, VirtualStatesCantMatch, VArrayStructStateInfo
+from rpython.jit.metainterp.history import ConstInt, ConstPtr
+from rpython.jit.metainterp.resoperation import InputArgInt, InputArgRef,\
+     InputArgFloat
 from rpython.rtyper.lltypesystem import lltype, llmemory
 from rpython.jit.metainterp.optimizeopt.test.test_util import LLtypeMixin, BaseTest, \
                                                            equaloplists
 from rpython.jit.metainterp.optimizeopt.intutils import IntBound
-from rpython.jit.metainterp.optimizeopt.virtualize import (VirtualValue,
-        VArrayValue, VStructValue, VArrayStructValue)
 from rpython.jit.metainterp.history import TreeLoop, JitCellToken
 from rpython.jit.metainterp.optimizeopt.test.test_optimizeopt import FakeMetaInterpStaticData
+from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer
 from rpython.jit.metainterp.resoperation import ResOperation, rop
 from rpython.jit.metainterp import resume
 
+class FakeOptimizer(Optimizer):
+    def __init__(self):
+        self.optearlyforce = None
+
 class BaseTestGenerateGuards(BaseTest):
 
     def _box_or_value(self, box_or_value=None):
@@ -74,6 +78,14 @@
         with py.test.raises(VirtualStatesCantMatch):
             info1.generate_guards(info2, value, state)
 
+    def test_make_inputargs(self):
+        optimizer = FakeOptimizer()
+        args = [InputArgInt()]
+        info0 = NotVirtualStateInfo(optimizer, args[0])
+        vs = VirtualState([info0])
+        assert vs.make_inputargs(args, optimizer) == args
+        info0.level = LEVEL_CONSTANT
+        assert vs.make_inputargs(args, optimizer) == []
 
     def test_position_generalization(self):
         def postest(info1, info2):
@@ -95,7 +107,7 @@
             self.check_invalid(info1, info2, state=state)
             assert info1 in state.bad and info2 in state.bad
 
-        for BoxType in (BoxInt, BoxFloat, BoxPtr):
+        for BoxType in (InputArgInt, InputArgFloat, InputArgPtr):
             info1 = NotVirtualStateInfo(OptValue(BoxType()))
             info2 = NotVirtualStateInfo(OptValue(BoxType()))
             postest(info1, info2)
@@ -1386,16 +1398,6 @@
 class TestLLtypeBridges(BaseTestBridges, LLtypeMixin):
     pass
 
-class FakeOptimizer:
-    def __init__(self):
-        self.opaque_pointers = {}
-        self.values = {}
-    def make_equal_to(*args):
-        pass
-    def getvalue(*args):
-        pass
-    def emit_operation(*args):
-        pass
 
 
 class TestShortBoxes:
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
@@ -137,7 +137,13 @@
 
             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(),
+                vs = start_label.getdescr().virtual_state
+                if vs is not None:
+                    args = vs.make_inputargs(stop_label.getarglist(),
+                                             self.optimizer)
+                else:
+                    args = stop_label.getarglist()
+                jumpop = ResOperation(rop.JUMP, args,
                                       descr=start_label.getdescr())
                 #if self.short:
                 #    # Construct our short preamble
@@ -222,7 +228,7 @@
 
         short_boxes = ShortBoxes(self.optimizer, inputargs)
 
-        inputarg_setup_ops = []
+        proven_constants = []
         for i in range(len(original_jump_args)):
             srcbox = jump_args[i]
             if srcbox is not original_jump_args[i]:
@@ -231,7 +237,7 @@
                     if info and info.is_virtual():
                         xxx
             if original_jump_args[i] is not srcbox and srcbox.is_constant():
-                inputarg_setup_ops.append((original_jump_args[i], srcbox))
+                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)
@@ -264,7 +270,7 @@
             if op and op.type != 'v':
                 exported_values[op] = self.optimizer.getinfo(op)
 
-        return ExportedState(short_boxes, inputarg_setup_ops, exported_values)
+        return ExportedState(short_boxes, proven_constants, exported_values)
 
     def import_state(self, targetop, exported_state):
         if not targetop: # Trace did not start with a label
@@ -291,6 +297,8 @@
         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)
 
         # Setup the state of the new optimizer by emiting the
         # short operations and discarding the result
@@ -309,6 +317,7 @@
         return
         seen = {}
         for op in self.short_boxes.operations():
+            yyy
             self.ensure_short_op_emitted(op, self.optimizer, seen)
             if op and op.type != 'v':
                 preamble_value = exported_state.exported_values[op]
@@ -709,9 +718,9 @@
 
 
 class ExportedState(object):
-    def __init__(self, short_boxes, inputarg_setup_ops, exported_values):
+    def __init__(self, short_boxes, proven_constants, exported_values):
         self.short_boxes = short_boxes
-        self.inputarg_setup_ops = inputarg_setup_ops
+        self.proven_constants = proven_constants
         self.exported_values = exported_values
 
     def dump(self, metainterp_sd):
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
@@ -282,7 +282,14 @@
     lenbound = None
     intbound = None
     
-    def __init__(self, cpu, ptrinfo, is_opaque=False):
+    def __init__(self, optimizer, box):
+        info = optimizer.getinfo(box)
+        if info and info.is_constant():
+            self.level = LEVEL_CONSTANT
+        else:
+            self.level = LEVEL_UNKNOWN
+        return
+        yyy
         self.level = LEVEL_UNKNOWN
         if ptrinfo is not None:
             self.known_class = ptrinfo.get_known_class(cpu)
@@ -461,15 +468,6 @@
         debug_print(indent + mark + 'NotVirtualInfo(%d' % self.position +
                     ', ' + l + ', ' + self.intbound.__repr__() + lb + ')')
 
-class IntNotVirtualStateInfo(NotVirtualStateInfo):
-    def __init__(self, intbound):
-        # XXX do we care about non null?
-        self.intbound = intbound
-        if intbound.is_constant():
-            self.level = LEVEL_CONSTANT
-        else:
-            self.level = LEVEL_UNKNOWN
-
 
 class VirtualState(object):
     def __init__(self, state):
@@ -502,8 +500,11 @@
         if optimizer.optearlyforce:
             optimizer = optimizer.optearlyforce
         assert len(inputargs) == len(self.state)
-        return [x for x in inputargs if not isinstance(x, Const)]
-        return inputargs
+        inpargs = []
+        for i, state in enumerate(self.state):
+            if state.level != LEVEL_CONSTANT:
+                inpargs.append(inputargs[i])
+        return inpargs
         inputargs = [None] * self.numnotvirtuals
 
         # We try twice. The first time around we allow boxes to be forced
@@ -597,16 +598,9 @@
 
         return VirtualState(state)
 
-    def visit_not_ptr(self, box, intbound):
-        return IntNotVirtualStateInfo(intbound=intbound)
-    
     def visit_not_virtual(self, box):
         is_opaque = box in self.optimizer.opaque_pointers
-        if box.type == 'r':
-            ptrinfo = self.optimizer.getptrinfo(box)
-        else:
-            return self.visit_not_ptr(box, self.optimizer.getintbound(box))
-        return NotVirtualStateInfo(self.optimizer.cpu, ptrinfo, is_opaque)
+        return NotVirtualStateInfo(self.optimizer, box)
 
     def visit_virtual(self, known_class, fielddescrs):
         return VirtualStateInfo(known_class, fielddescrs)


More information about the pypy-commit mailing list