Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79222:d878ab104991
Date: 2015-08-25 12:50 +0200
http://bitbucket.org/pypy/pypy/changeset/d878ab104991/

Log:    implement force_at_the_end_of_preamble for now

diff --git a/rpython/jit/metainterp/optimizeopt/info.py 
b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -35,6 +35,11 @@
     def is_virtual(self):
         return False
 
+    def force_at_the_end_of_preamble(self, op, optforce, rec):
+        if not self.is_virtual():
+            return optforce.get_box_replacement(op)
+        return self._force_at_the_end_of_preamble(op, optforce, rec)
+
     def get_known_class(self, cpu):
         return None
 
@@ -115,6 +120,9 @@
             return newop
         return op
 
+    def _force_at_the_end_of_preamble(self, op, optforce, rec):
+        return self.force_box(op, optforce)
+
     def is_virtual(self):
         return self.vdescr is not None
 
@@ -170,6 +178,21 @@
                 else:
                     optforce.emit_operation(setfieldop)
 
+    def _force_at_the_end_of_preamble(self, op, optforce, rec):
+        if self._fields is None:
+            return optforce.get_box_replacement(op)
+        if self in rec:
+            return optforce.get_box_replacement(op)
+        rec[self] = None
+        for i, fldbox in enumerate(self._fields):
+            if fldbox is not None:
+                info = optforce.getptrinfo(fldbox)
+                if info is not None:
+                    fldbox = info.force_at_the_end_of_preamble(fldbox, 
optforce,
+                                                               rec)
+                    self._fields[i] = fldbox
+        return op
+
     def _visitor_walk_recursive(self, instbox, visitor, optimizer):
         lst = self.vdescr.get_all_fielddescrs()
         assert self.is_virtual()
@@ -425,6 +448,21 @@
                                            descr=descr)
             shortboxes.add_heap_op(op, getarrayitem_op)
 
+    def _force_at_the_end_of_preamble(self, op, optforce, rec):
+        if self._items is None:
+            return optforce.get_box_replacement(op)
+        if self in rec:
+            return optforce.get_box_replacement(op)
+        rec[self] = None
+        for i, fldbox in enumerate(self._items):
+            if fldbox is not None:
+                info = optforce.getptrinfo(fldbox)
+                if info is not None:
+                    fldbox = info.force_at_the_end_of_preamble(fldbox, 
optforce,
+                                                               rec)
+                    self._items[i] = fldbox
+        return op
+
     def make_guards(self, op, short):
         AbstractVirtualPtrInfo.make_guards(self, op, short)
         if self.lenbound is not None:
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
@@ -144,7 +144,7 @@
         return self.optimizer.get_box_replacement(op, not_const=not_const)
 
     def getlastop(self):
-        return self.optimizer._last_emitted_op
+        return self.optimizer.getlastop()
 
     def replace_op_with(self, op, newopnum, args=None, descr=None):
         return self.optimizer.replace_op_with(op, newopnum, args, descr)
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
@@ -193,8 +193,8 @@
 
     def jump_to_existing_trace(self, jump_op):
         jitcelltoken = jump_op.getdescr()
+        virtual_state = self.get_virtual_state(jump_op.getarglist())
         args = [self.get_box_replacement(op) for op in jump_op.getarglist()]
-        virtual_state = self.get_virtual_state(args)
         infos = [self.optimizer.getinfo(arg) for arg in args]
         for target_token in jitcelltoken.target_tokens:
             target_virtual_state = target_token.virtual_state
@@ -202,8 +202,7 @@
                 continue
             try:
                 extra_guards = target_virtual_state.generate_guards(
-                    virtual_state, jump_op.getarglist(), infos,
-                    self.optimizer.cpu)
+                    virtual_state, args, infos, self.optimizer.cpu)
                 patchguardop = self.optimizer.patchguardop
                 for guard in extra_guards.extra_guards:
                     if isinstance(guard, GuardResOp):
@@ -258,8 +257,8 @@
                 op.set_forwarded(None)
 
     def export_state(self, start_label, original_label_args, 
renamed_inputargs):
+        virtual_state = self.get_virtual_state(original_label_args)
         end_args = [self.get_box_replacement(a) for a in original_label_args]
-        virtual_state = self.get_virtual_state(end_args)
         infos = {}
         for arg in end_args:
             infos[arg] = self.optimizer.getinfo(arg)
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
@@ -609,6 +609,9 @@
             pass
         if box.type == 'r':
             info = opt.getptrinfo(box)
+            if info is not None:
+                rec = {}
+                box = info.force_at_the_end_of_preamble(box, opt.optimizer, 
rec)
             if info is not None and info.is_virtual():
                 result = info.visitor_dispatch_virtual_type(self)
                 self.info[box] = result
diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py 
b/rpython/jit/metainterp/optimizeopt/vstring.py
--- a/rpython/jit/metainterp/optimizeopt/vstring.py
+++ b/rpython/jit/metainterp/optimizeopt/vstring.py
@@ -502,17 +502,20 @@
 
     def make_vstring_plain(self, op, mode, length):
         vvalue = VStringPlainInfo(mode, True, length)
-        self.make_equal_to(op, vvalue)
+        op = self.replace_op_with(op, op.getopnum())
+        op.set_forwarded(vvalue)
         return vvalue
 
     def make_vstring_concat(self, op, mode, vleft, vright):
         vvalue = VStringConcatInfo(mode, vleft, vright, True)
-        self.make_equal_to(op, vvalue)
+        op = self.replace_op_with(op, op.getopnum())
+        op.set_forwarded(vvalue)
         return vvalue
 
     def make_vstring_slice(self, op, strbox, startbox, mode, lengthbox):
         vvalue = VStringSliceInfo(strbox, startbox, lengthbox, mode)
-        self.make_equal_to(op, vvalue)
+        op = self.replace_op_with(op, op.getopnum())
+        op.set_forwarded(vvalue)
         return vvalue
 
     def optimize_NEWSTR(self, op):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to