Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r78514:dc4e5a98335d
Date: 2015-07-09 22:48 +0200
http://bitbucket.org/pypy/pypy/changeset/dc4e5a98335d/

Log:    invent new names for newXXX, so we don't run into clashes when
        unrolling

diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py 
b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -258,15 +258,14 @@
                 self.pure_from_args(rop.INT_SUB, [args[0], result], args[1])
             #elif opnum == rop.INT_MUL_OVF:
             #    self.pure(rop.INT_MUL, args[:], result)
-        self.emit_operation(op)
+            self.emit_operation(op)
 
     def optimize_GUARD_OVERFLOW(self, op):
         # If INT_xxx_OVF was replaced by INT_xxx, *but* we still see
         # GUARD_OVERFLOW, then the loop is invalid.
         lastop = self.last_emitted_operation
         if lastop is None:
-            raise InvalidLoop('An INT_xxx_OVF was proven not to overflow but' +
-                              'guarded with GUARD_OVERFLOW')
+            return # e.g. beginning of the loop
         opnum = lastop.getopnum()
         if opnum not in (rop.INT_ADD_OVF, rop.INT_SUB_OVF, rop.INT_MUL_OVF):
             raise InvalidLoop('An INT_xxx_OVF was proven not to overflow but' +
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -803,7 +803,7 @@
         escape_n(i3)
         p1 = new_with_vtable(descr=nodesize)
         setfield_gc(p1, i1, descr=valuedescr)
-        p1sub = new_with_vtable(ConstClass(node_vtable2))
+        p1sub = new_with_vtable(descr=nodesize2)
         setfield_gc(p1sub, i1, descr=valuedescr)
         setfield_gc(p1, p1sub, descr=nextdescr)
         jump(i1, p1, p2)
@@ -821,9 +821,9 @@
         i3 = getfield_gc_i(p2, descr=valuedescr)
         escape_n(i3)
         p4 = new_with_vtable(descr=nodesize)
-        p1sub = new_with_vtable(ConstClass(node_vtable2))
+        setfield_gc(p4, i1, descr=valuedescr)
+        p1sub = new_with_vtable(descr=nodesize2)
         setfield_gc(p1sub, i1, descr=valuedescr)
-        setfield_gc(p4, i1, descr=valuedescr)
         setfield_gc(p4, p1sub, descr=nextdescr)
         jump(i1, p4)
         """
@@ -836,7 +836,7 @@
         i3 = getfield_gc_i(p3sub, descr=valuedescr)
         escape_n(i3)
         p1 = new_with_vtable(descr=nodesize)
-        p2sub = new_with_vtable(ConstClass(node_vtable2))
+        p2sub = new_with_vtable(descr=nodesize2)
         setfield_gc(p2sub, i1, descr=valuedescr)
         setfield_gc(p2, p2sub, descr=nextdescr)
         jump(i1, p1, p2)
@@ -848,7 +848,7 @@
         p3sub = getfield_gc_r(p3, descr=nextdescr)
         i3 = getfield_gc_i(p3sub, descr=valuedescr)
         escape_n(i3)
-        p2sub = new_with_vtable(ConstClass(node_vtable2))
+        p2sub = new_with_vtable(descr=nodesize2)
         setfield_gc(p2sub, i1, descr=valuedescr)
         setfield_gc(p2, p2sub, descr=nextdescr)
         jump(i1, p2, p2sub)
@@ -858,7 +858,7 @@
         i3 = getfield_gc_i(p2sub, descr=valuedescr)
         escape_n(i3)
         p1 = new_with_vtable(descr=nodesize)
-        p3sub = new_with_vtable(ConstClass(node_vtable2))
+        p3sub = new_with_vtable(descr=nodesize2)
         setfield_gc(p3sub, i1, descr=valuedescr)
         setfield_gc(p1, p3sub, descr=nextdescr)
         jump(i1, p1, p3sub)
@@ -8093,7 +8093,7 @@
         """
         self.optimize_loop(ops, expected)
 
-    def test_exploding_duplicatipon(self):
+    def test_exploding_duplication(self):
         ops = """
         [i1, i2]
         i3 = int_add(i1, i1)
@@ -8342,13 +8342,13 @@
         ops = """
         [i0, i1]
         p0 = escape_r()
-        setfield_gc(p0, p0, descr=arraydescr)
+        setfield_gc(p0, p0, descr=nextdescr)
         jump(i0, i1)
         """
         expected = """
         [i0, i1]
         p0 = escape_r()
-        setfield_gc(p0, p0, descr=arraydescr)
+        setfield_gc(p0, p0, descr=nextdescr)
         jump(i0, i1)
         """
         self.optimize_loop(ops, expected)
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
@@ -85,7 +85,8 @@
         jump_args = [self.get_box_replacement(op)
                      for op in end_jump.getarglist()]
         jump_args = state.virtual_state.make_inputargs(jump_args,
-                                                       self.optimizer)
+                                                       self.optimizer,
+                                                       force_boxes=True)
         jump_op = ResOperation(rop.JUMP, jump_args)
         self.optimizer._newoperations.append(jump_op)
         return (UnrollInfo(self.make_short_preamble(start_label.getarglist())),
@@ -188,7 +189,6 @@
         assert isinstance(start_target, TargetToken)
         return stop_target.targeting_jitcell_token is 
start_target.targeting_jitcell_token
 
-
     def export_state(self, start_label, end_label, renamed_inputargs):
         original_label_args = end_label.getarglist()
         end_args = [self.get_box_replacement(a) for a in original_label_args]
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py 
b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -18,7 +18,8 @@
     def make_virtual(self, known_class, source_op, descr):
         opinfo = info.InstancePtrInfo(known_class, vdescr=descr)
         opinfo.init_fields(descr, 0)
-        source_op.set_forwarded(opinfo)
+        newop = self.replace_op_with(source_op, source_op.getopnum())
+        newop.set_forwarded(opinfo)
         return opinfo
 
     def make_varray(self, arraydescr, size, source_op, clear=False):
@@ -28,23 +29,27 @@
         else:
             const = self.new_const_item(arraydescr)
             opinfo = info.ArrayPtrInfo(const, size, clear, vdescr=arraydescr)
-        source_op.set_forwarded(opinfo)
+        newop = self.replace_op_with(source_op, source_op.getopnum())
+        newop.set_forwarded(opinfo)
         return opinfo
 
     def make_vstruct(self, structdescr, source_op):
         opinfo = info.StructPtrInfo(vdescr=structdescr)
         opinfo.init_fields(structdescr, 0)
-        source_op.set_forwarded(opinfo)
+        newop = self.replace_op_with(source_op, source_op.getopnum())
+        newop.set_forwarded(opinfo)
         return opinfo
 
     def make_virtual_raw_memory(self, size, source_op):
         opinfo = info.RawBufferPtrInfo(self.optimizer.cpu, size)
-        source_op.set_forwarded(opinfo)
+        newop = self.replace_op_with(source_op, source_op.getopnum())
+        newop.set_forwarded(opinfo)
         return opinfo
 
     def make_virtual_raw_slice(self, offset, parent, source_op):
         opinfo = info.RawSlicePtrInfo(offset, parent)
-        source_op.set_forwarded(opinfo)
+        newop = self.replace_op_with(source_op, source_op.getopnum())
+        newop.set_forwarded(opinfo)
         return opinfo
 
     def optimize_GUARD_NO_EXCEPTION(self, op):
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
@@ -132,7 +132,7 @@
     def _generalization_of_structpart(self, other):
         raise NotImplementedError
 
-    def enum_forced_boxes(self, boxes, box, optimizer):
+    def enum_forced_boxes(self, boxes, box, optimizer, force_boxes=False):
         info = optimizer.getptrinfo(box)
         box = optimizer.get_box_replacement(box)
         if info is None or not info.is_virtual():
@@ -143,7 +143,7 @@
                 continue
             if state.position > self.position:
                 fieldbox = info._fields[i]
-                state.enum_forced_boxes(boxes, fieldbox, optimizer)
+                state.enum_forced_boxes(boxes, fieldbox, optimizer, 
force_boxes)
 
     def _enum(self, virtual_state):
         for s in self.fieldstate:
@@ -423,18 +423,18 @@
             return
         raise VirtualStatesCantMatch("intbounds don't match")
 
-    def enum_forced_boxes(self, boxes, box, optimizer):
+    def enum_forced_boxes(self, boxes, box, optimizer, force_boxes=False):
         if self.level == LEVEL_CONSTANT:
             return
         assert 0 <= self.position_in_notvirtuals
-        #if optimizer:
-        #    box = value.force_box(optimizer)
-        #else:
         box = optimizer.get_box_replacement(box)
         if box.type == 'r':
             info = optimizer.getptrinfo(box)
             if info and info.is_virtual():
-                raise BadVirtualState
+                if force_boxes:
+                    info.force_box(box, optimizer)
+                else:
+                    raise BadVirtualState
         boxes[self.position_in_notvirtuals] = box
 
     def _enum(self, virtual_state):
@@ -507,7 +507,8 @@
                                           state)
         return state
 
-    def make_inputargs(self, inputargs, optimizer, keyboxes=False):
+    def make_inputargs(self, inputargs, optimizer, keyboxes=False,
+                       force_boxes=False):
         assert len(inputargs) == len(self.state)
         #inpargs = []
         #for i, state in enumerate(self.state):
@@ -516,11 +517,13 @@
         #return inpargs
         boxes = [None] * self.numnotvirtuals
 
-        # XXX no longer correct as far as I can tell, maybe we should
-        #     make the forcing more explicit somewhere else
         # We try twice. The first time around we allow boxes to be forced
         # which might change the virtual state if the box appear in more
         # than one place among the inputargs.
+        if force_boxes:
+            for i in range(len(inputargs)):
+                self.state[i].enum_forced_boxes(boxes, inputargs[i], optimizer,
+                                                True)
         for i in range(len(inputargs)):
             self.state[i].enum_forced_boxes(boxes, inputargs[i], optimizer)
         #for i in range(len(values)):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to