Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r78176:ab923482ef81
Date: 2015-06-18 13:50 +0200
http://bitbucket.org/pypy/pypy/changeset/ab923482ef81/

Log:    scarily enough to start passing unrolling tests

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
@@ -279,39 +279,16 @@
         self.metainterp_sd.profiler.count(jitprof.Counters.OPT_FORCINGS)
         self.resumedata_memo.forget_numberings()
 
-    def getinterned(self, box):
-        constbox = self.get_constant_box(box)
-        if constbox is None:
-            return box
-        if constbox.type == REF:
-            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)
+    def getinfo(self, op):
+        if op.type == 'r':
+            return self.getptrinfo(op)
+        elif op.type == 'i':
+            return self.getintbound(op)
         else:
-            return box
+            zzz
 
-    ## def getinfo(self, op, create=False):
-    ##     xxx
-    ##     yyy
-
-    ##     XXX
-    ##     box = self.getinterned(box)
-    ##     try:
-    ##         value = self.values[box]
-    ##     except KeyError:
-    ##         if box.type == "r":
-    ##             value = self.values[box] = PtrOptValue(box)
-    ##         elif box.type == "i":
-    ##             value = self.values[box] = IntOptValue(box)
-    ##         else:
-    ##             assert box.type == "f"
-    ##             value = self.values[box] = OptValue(box)
-    ##     self.ensure_imported(value)
-    ##     return value
+    def setinfo_from_preamble(self, op, old_info):
+        pass # deal with later
 
     def get_box_replacement(self, op):
         if op is None:
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
@@ -179,9 +179,9 @@
 
         virtual_state = self.get_virtual_state(jump_args)
 
-        values = [self.getinfo(arg) for arg in jump_args]
-        inputargs = virtual_state.make_inputargs(values, self.optimizer)
-        short_inputargs = virtual_state.make_inputargs(values, self.optimizer, 
keyboxes=True)
+        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:
@@ -190,16 +190,22 @@
         short_boxes = ShortBoxes(self.optimizer, inputargs)
 
         self.optimizer.clear_newoperations()
-        for i in range(len(original_jump_args)):
-            srcbox = jump_args[i]
-            if values[i].is_virtual():
-                srcbox = values[i].force_box(self.optimizer)
-            if original_jump_args[i] is not srcbox:
-                opnum = OpHelpers.same_as_for_type(original_jump_args[i].type)
-                op = self.optimizer.replace_op_with(original_jump_args[i],
-                                                    opnum, [srcbox],
-                                                    descr=DONT_CHANGE)
-                self.optimizer.emit_operation(op)
+        # for i in range(len(original_jump_args)):
+        #     srcbox = jump_args[i]
+        #     if srcbox is not original_jump_args[i]:
+        #         xxx
+        #     if srcbox.type != 'r':
+        #         continue
+        #     info = self.optimizer.getptrinfo(srcbox)
+        #     if info and info.is_virtual():
+        #         xxx
+        #         srcbox = values[i].force_box(self.optimizer)
+        #     if original_jump_args[i] is not srcbox:
+        #         opnum = 
OpHelpers.same_as_for_type(original_jump_args[i].type)
+        #         op = self.optimizer.replace_op_with(original_jump_args[i],
+        #                                             opnum, [srcbox],
+        #                                             descr=DONT_CHANGE)
+        #         self.optimizer.emit_operation(op)
         inputarg_setup_ops = self.optimizer.get_newoperations()
 
         target_token = targetop.getdescr()
@@ -210,10 +216,10 @@
 
         exported_values = {}
         for box in inputargs:
-            exported_values[box] = self.optimizer.getvalue(box)
+            exported_values[box] = self.optimizer.getinfo(box)
         for op in short_boxes.operations():
             if op and op.type != 'v':
-                exported_values[op] = self.optimizer.getvalue(op)
+                exported_values[op] = self.optimizer.getinfo(op)
 
         return ExportedState(short_boxes, inputarg_setup_ops, exported_values)
 
@@ -240,9 +246,8 @@
         self.initial_virtual_state = target_token.virtual_state
 
         for box in self.inputargs:
-            preamble_value = exported_state.exported_values[box]
-            value = self.optimizer.getvalue(box)
-            value.import_from(preamble_value, self.optimizer)
+            preamble_info = exported_state.exported_values[box]
+            self.optimizer.setinfo_from_preamble(box, preamble_info)
 
         # Setup the state of the new optimizer by emiting the
         # short operations and discarding the result
@@ -255,6 +260,7 @@
             self.ensure_short_op_emitted(op, self.optimizer, seen)
             if op and op.type != 'v':
                 preamble_value = exported_state.exported_values[op]
+                continue
                 value = self.optimizer.getvalue(op)
                 if not value.is_virtual() and not value.is_constant():
                     imp = ValueImporter(self, preamble_value, op)
@@ -306,9 +312,10 @@
 
         # Construct jumpargs from the virtual state
         original_jumpargs = jumpop.getarglist()[:]
-        values = [self.getvalue(arg) for arg in jumpop.getarglist()]
+        jump_boxes = [self.get_box_replacement(arg) for arg in
+                      jumpop.getarglist()]
         try:
-            jumpargs = virtual_state.make_inputargs(values, self.optimizer)
+            jumpargs = virtual_state.make_inputargs(jump_boxes, self.optimizer)
         except BadVirtualState:
             raise InvalidLoop('The state of the optimizer at the end of ' +
                               'peeled loop is inconsistent with the ' +
@@ -317,7 +324,7 @@
         jumpop.initarglist(jumpargs)
 
         # Inline the short preamble at the end of the loop
-        jmp_to_short_args = virtual_state.make_inputargs(values,
+        jmp_to_short_args = virtual_state.make_inputargs(jump_boxes,
                                                          self.optimizer,
                                                          keyboxes=True)
         assert len(short_inputargs) == len(jmp_to_short_args)
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
@@ -9,6 +9,8 @@
 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'
 
 class BadVirtualState(Exception):
     pass
@@ -276,9 +278,14 @@
     def debug_header(self, indent):
         debug_print(indent + 'VArrayStructStateInfo(%d):' % self.position)
 
-
 class NotVirtualStateInfo(AbstractVirtualStateInfo):
-    def __init__(self, value, is_opaque=False):
+    lenbound = None
+    intbound = None
+    
+    def __init__(self, box, is_opaque=False):
+        self.level = LEVEL_UNKNOWN
+        return
+        xxx
         self.is_opaque = is_opaque
         self.known_class = value.get_known_class()
         self.level = value.getlevel()
@@ -385,6 +392,8 @@
         assert 0, "unreachable"
 
     def _generate_guards_intbounds(self, other, box, extra_guards):
+        if self.intbound is None:
+            return
         if self.intbound.contains_bound(other.intbound):
             return
         xxx
@@ -450,6 +459,15 @@
         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):
@@ -478,10 +496,11 @@
                                           state)
         return state
 
-    def make_inputargs(self, values, optimizer, keyboxes=False):
+    def make_inputargs(self, inputargs, optimizer, keyboxes=False):
         if optimizer.optearlyforce:
             optimizer = optimizer.optearlyforce
-        assert len(values) == len(self.state)
+        assert len(inputargs) == len(self.state)
+        return inputargs
         inputargs = [None] * self.numnotvirtuals
 
         # We try twice. The first time around we allow boxes to be forced
@@ -555,20 +574,32 @@
             opt = self.optimizer.optearlyforce
         else:
             opt = self.optimizer
+        state = []
         for box in jump_args:
+            box = opt.get_box_replacement(box)
             if box.type == 'r':
-                zxsadsadsa
+                info = opt.getptrinfo(box)
+                if info is not None and info.is_virtual():
+                    xxx
+                else:
+                    state.append(self.visit_not_virtual(box))
+            elif box.type == 'i':
+                intbound = opt.getintbound(box)
+                state.append(self.visit_not_ptr(box, intbound))
+            else:
+                xxx
         #values = [self.getvalue(box).force_at_end_of_preamble(already_forced,
         #                                                      opt)
         #          for box in jump_args]
 
-        #for value in values:
-        #    value.visitor_walk_recursive(self)
-        return VirtualState([self.state(box) for box in jump_args])
+        return VirtualState(state)
 
-    def visit_not_virtual(self, value):
-        is_opaque = value in self.optimizer.opaque_pointers
-        return NotVirtualStateInfo(value, is_opaque)
+    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
+        return NotVirtualStateInfo(box, is_opaque)
 
     def visit_virtual(self, known_class, fielddescrs):
         return VirtualStateInfo(known_class, fielddescrs)
@@ -643,10 +674,6 @@
         return alts
 
     def add_to_short(self, box, op):
-        xxx
-        #if op:
-        #    op = op.clone(self.memo)
-        #    op.is_source_op = True
         if box in self.short_boxes:
             xxx
             return # XXX avoid those corner cases
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to