[pypy-commit] pypy optresult: clean the escape mess and start passing first unrolling tests

fijal noreply at buildbot.pypy.org
Wed Dec 3 18:00:39 CET 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r74796:fe81bdbcbbaa
Date: 2014-12-03 18:59 +0200
http://bitbucket.org/pypy/pypy/changeset/fe81bdbcbbaa/

Log:	clean the escape mess and start passing first unrolling tests

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
@@ -13,7 +13,6 @@
     TargetToken, AbstractFailDescr, ConstInt)
 from rpython.jit.metainterp import history, jitexc
 from rpython.jit.metainterp.optimize import InvalidLoop
-from rpython.jit.metainterp.inliner import Inliner
 from rpython.jit.metainterp.resume import NUMBERING, PENDINGFIELDSP, ResumeDataDirectReader
 from rpython.jit.codewriter import heaptracker, longlong
 
@@ -104,9 +103,12 @@
 # ____________________________________________________________
 
 class Memo(object):
-    def __init__(self):
+    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)
diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -285,6 +285,9 @@
     def getfloatstorage(self):
         return self.value
 
+    def getfloat(self):
+        return longlong.getrealfloat(self.value)
+
     getvalue = getfloatstorage
 
     def _get_hash_(self):
diff --git a/rpython/jit/metainterp/inliner.py b/rpython/jit/metainterp/inliner.py
deleted file mode 100644
--- a/rpython/jit/metainterp/inliner.py
+++ /dev/null
@@ -1,57 +0,0 @@
-from rpython.jit.metainterp.history import Const
-from rpython.jit.metainterp.resume import Snapshot
-
-
-class Inliner(object):
-    def __init__(self, inputargs, jump_args):
-        assert len(inputargs) == len(jump_args)
-        self.argmap = {}
-        for i in range(len(inputargs)):
-            if inputargs[i] in self.argmap:
-                assert self.argmap[inputargs[i]] == jump_args[i]
-            else:
-                self.argmap[inputargs[i]] = jump_args[i]
-        self.snapshot_map = {None: None}
-
-    def inline_op(self, newop, ignore_result=False, clone=True,
-                  ignore_failargs=False):
-        if clone:
-            newop = newop.clone()
-        args = newop.getarglist()
-        newop.initarglist([self.inline_arg(a) for a in args])
-
-        if newop.is_guard():
-            args = newop.getfailargs()
-            if args and not ignore_failargs:
-                newop.setfailargs([self.inline_arg(a) for a in args])
-            else:
-                newop.setfailargs([])
-
-        if newop.result and not ignore_result:
-            old_result = newop.result
-            newop.result = newop.result.clonebox()
-            self.argmap[old_result] = newop.result
-
-        self.inline_descr_inplace(newop.getdescr())
-
-        return newop
-
-    def inline_descr_inplace(self, descr):
-        from rpython.jit.metainterp.compile import ResumeGuardDescr
-        if isinstance(descr, ResumeGuardDescr):
-            descr.rd_snapshot = self.inline_snapshot(descr.rd_snapshot)
-
-    def inline_arg(self, arg):
-        if arg is None:
-            return None
-        if isinstance(arg, Const):
-            return arg
-        return self.argmap[arg]
-
-    def inline_snapshot(self, snapshot):
-        if snapshot in self.snapshot_map:
-            return self.snapshot_map[snapshot]
-        boxes = [self.inline_arg(a) for a in snapshot.boxes]
-        new_snapshot = Snapshot(self.inline_snapshot(snapshot.prev), boxes)
-        self.snapshot_map[snapshot] = new_snapshot
-        return new_snapshot
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -579,11 +579,11 @@
         self.emit_operation(op)
 
     def optimize_CAST_PTR_TO_INT(self, op):
-        self.pure(rop.CAST_INT_TO_PTR, [op.result], op.getarg(0))
+        self.pure(rop.CAST_INT_TO_PTR, [op], op.getarg(0))
         self.emit_operation(op)
 
     def optimize_CAST_INT_TO_PTR(self, op):
-        self.pure(rop.CAST_PTR_TO_INT, [op.result], op.getarg(0))
+        self.pure(rop.CAST_PTR_TO_INT, [op], op.getarg(0))
         self.emit_operation(op)
 
     def optimize_SAME_AS_i(self, op):
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -219,14 +219,14 @@
         ops = """
         [i0]
         p0 = new_with_vtable(ConstClass(node_vtable))
-        escape(p0)
+        escape_n(p0)
         guard_class(p0, ConstClass(node_vtable)) []
         jump(i0)
         """
         expected = """
         [i0]
         p0 = new_with_vtable(ConstClass(node_vtable))
-        escape(p0)
+        escape_n(p0)
         jump(i0)
         """
         self.optimize_loop(ops, expected)
@@ -315,19 +315,19 @@
     def test_remove_consecutive_guard_value_constfold(self):
         ops = """
         []
-        i0 = escape()
+        i0 = escape_i()
         guard_value(i0, 0) []
         i1 = int_add(i0, 1)
         guard_value(i1, 1) []
         i2 = int_add(i1, 2)
-        escape(i2)
+        escape_n(i2)
         jump()
         """
         expected = """
         []
-        i0 = escape()
+        i0 = escape_i()
         guard_value(i0, 0) []
-        escape(3)
+        escape_n(3)
         jump()
         """
         self.optimize_loop(ops, expected)
@@ -428,14 +428,14 @@
     def test_ooisnull_on_null_ptr_1(self):
         ops = """
         []
-        p0 = escape()
+        p0 = escape_r()
         guard_isnull(p0) []
         guard_isnull(p0) []
         jump()
         """
         expected = """
         []
-        p0 = escape()
+        p0 = escape_r()
         guard_isnull(p0) []
         jump()
         """
@@ -517,7 +517,7 @@
     def test_constptr_guard_value(self):
         ops = """
         []
-        p1 = escape()
+        p1 = escape_r()
         guard_value(p1, ConstPtr(myptr)) []
         jump()
         """
@@ -592,7 +592,7 @@
         ops = """
         [i1, p2, p3]
         i3 = getfield_gc_i(p3, descr=valuedescr)
-        escape(i3)
+        escape_n(i3)
         p1 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p1, i1, descr=valuedescr)
         jump(i1, p1, p2)
@@ -604,7 +604,7 @@
         ops = """
         [i1, p2, p3]
         i3 = getfield_gc_i(p3, descr=valuedescr)
-        escape(i3)
+        escape_n(i3)
         p1 = new_with_vtable(ConstClass(node_vtable))
         p1sub = new_with_vtable(ConstClass(node_vtable2))
         setfield_gc(p1sub, i1, descr=valuedescr)
@@ -621,7 +621,7 @@
         [i1, p2, p3]
         p3sub = getfield_gc_r(p3, descr=nextdescr)
         i3 = getfield_gc_i(p3sub, descr=valuedescr)
-        escape(i3)
+        escape_n(i3)
         p1 = new_with_vtable(ConstClass(node_vtable))
         p2sub = new_with_vtable(ConstClass(node_vtable2))
         setfield_gc(p2sub, i1, descr=valuedescr)
@@ -974,7 +974,7 @@
         f2 = getinteriorfield_gc_f(p0, 0, descr=complexrealdescr)
         f3 = getinteriorfield_gc_f(p0, 0, descr=compleximagdescr)
         f4 = float_mul(f2, f3)
-        i0 = escape(f4, p0)
+        i0 = escape_i(f4, p0)
         finish(i0)
         """
         expected = """
@@ -983,7 +983,7 @@
         p0 = new_array_clear(1, descr=complexarraydescr)
         setinteriorfield_gc(p0, 0, f1, descr=compleximagdescr)
         setinteriorfield_gc(p0, 0, f0, descr=complexrealdescr)
-        i0 = escape(f2, p0)
+        i0 = escape_i(f2, p0)
         finish(i0)
         """
         self.optimize_loop(ops, expected)
@@ -1008,8 +1008,8 @@
         setfield_gc(p1, i, descr=valuedescr)
         i0 = getfield_gc_i(p1, descr=valuedescr)
         i1 = int_add(i0, 1)
-        escape(p1)
-        escape(p1)
+        escape_n(p1)
+        escape_n(p1)
         jump(i1)
         """
         expected = """
@@ -1017,8 +1017,8 @@
         i1 = int_add(i, 1)
         p1 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p1, i, descr=valuedescr)
-        escape(p1)
-        escape(p1)
+        escape_n(p1)
+        escape_n(p1)
         jump(i1)
         """
         self.optimize_loop(ops, expected)
@@ -1027,7 +1027,7 @@
         ops = """
         [i, p0]
         i0 = getfield_gc_i(p0, descr=valuedescr)
-        escape(p0)
+        escape_n(p0)
         i1 = int_add(i0, i)
         p1 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p1, i1, descr=valuedescr)
@@ -1042,7 +1042,7 @@
         p1 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p1, i, descr=valuedescr)
         i1 = getfield_gc_i(p1, descr=valuedescr)
-        escape(p1)
+        escape_n(p1)
         i2 = getfield_gc_i(p1, descr=valuedescr)
         i3 = int_add(i1, i2)
         jump(i3)
@@ -1051,7 +1051,7 @@
         [i]
         p1 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p1, i, descr=valuedescr)
-        escape(p1)
+        escape_n(p1)
         i2 = getfield_gc_i(p1, descr=valuedescr)
         i3 = int_add(i, i2)
         jump(i3)
@@ -1065,7 +1065,7 @@
         setfield_gc(p1, i, descr=valuedescr)
         i1 = getfield_gc_i(p1, descr=valuedescr)
         setfield_gc(p1, 0, descr=valuedescr)
-        escape(p1)
+        escape_n(p1)
         i2 = getfield_gc_i(p1, descr=valuedescr)
         jump(i2)
         """
@@ -1073,7 +1073,7 @@
         [i]
         p1 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p1, 0, descr=valuedescr)
-        escape(p1)
+        escape_n(p1)
         i2 = getfield_gc_i(p1, descr=valuedescr)
         jump(i2)
         """
@@ -1185,7 +1185,7 @@
         p1 = new_array(5, descr=arraydescr)
         setarrayitem_gc(p1, 0, i1, descr=arraydescr)
         setarrayitem_gc(p1, 1, 0, descr=arraydescr)
-        escape(p1)
+        escape_n(p1)
         jump(i1)
         """
         expected = """
@@ -1193,7 +1193,7 @@
         p1 = new_array(5, descr=arraydescr)
         setarrayitem_gc(p1, 0, i1, descr=arraydescr)
         setarrayitem_gc(p1, 1, 0, descr=arraydescr)
-        escape(p1)
+        escape_n(p1)
         jump(i1)
         """
         self.optimize_loop(ops, expected)
@@ -1223,7 +1223,7 @@
         ops = """
         [i1, p2, p3]
         i3 = getarrayitem_gc_i(p3, 0, descr=arraydescr)
-        escape(i3)
+        escape_n(i3)
         p1 = new_array(1, descr=arraydescr)
         setarrayitem_gc(p1, 0, i1, descr=arraydescr)
         jump(i1, p1, p2)
@@ -1238,17 +1238,17 @@
         setfield_gc(p2, 3, descr=valuedescr)
         i1 = getfield_gc_i(p2, descr=valuedescr)    # i1 = const 3
         p1 = new_array(i1, descr=arraydescr)
-        escape(p1)
+        escape_n(p1)
         i2 = arraylen_gc(p1)
-        escape(i2)
+        escape_n(i2)
         jump()
         """
         expected = """
         []
         p1 = new_array(3, descr=arraydescr)
-        escape(p1)
+        escape_n(p1)
         i2 = arraylen_gc(p1)
-        escape(i2)
+        escape_n(i2)
         jump()
         """
         self.optimize_loop(ops, expected)
@@ -1257,14 +1257,14 @@
         ops = """
         [i1, p2]
         i2 = getfield_gc(p2, descr=adescr)
-        escape(i2)
+        escape_n(i2)
         p3 = new(descr=ssize)
         setfield_gc(p3, i1, descr=adescr)
         jump(i1, p3)
         """
         expected = """
         [i1, i2]
-        escape(i2)
+        escape_n(i2)
         jump(i1, i1)
         """
         py.test.skip("XXX")
@@ -1274,7 +1274,7 @@
         ops = """
         [i1, p2, p3]
         i3 = getfield_gc_i(p3, descr=adescr)
-        escape(i3)
+        escape_n(i3)
         p1 = new(descr=ssize)
         setfield_gc(p1, i1, descr=adescr)
         jump(i1, p1, p2)
@@ -1289,20 +1289,20 @@
         i2 = getfield_gc_i(p2, descr=valuedescr)
         i3 = getfield_gc_i(p1, descr=valuedescr)
         i4 = getfield_gc_i(p2, descr=valuedescr)
-        escape(i1)
-        escape(i2)
-        escape(i3)
-        escape(i4)
+        escape_n(i1)
+        escape_n(i2)
+        escape_n(i3)
+        escape_n(i4)
         jump(p1, p2)
         """
         expected = """
         [p1, p2]
         i1 = getfield_gc_i(p1, descr=valuedescr)
         i2 = getfield_gc_i(p2, descr=valuedescr)
-        escape(i1)
-        escape(i2)
-        escape(i1)
-        escape(i2)
+        escape_n(i1)
+        escape_n(i2)
+        escape_n(i1)
+        escape_n(i2)
         jump(p1, p2)
         """
         self.optimize_loop(ops, expected)
@@ -1312,13 +1312,13 @@
         [p1, i1]
         setfield_gc(p1, i1, descr=valuedescr)
         i2 = getfield_gc_i(p1, descr=valuedescr)
-        escape(i2)
+        escape_n(i2)
         jump(p1, i1)
         """
         expected = """
         [p1, i1]
         setfield_gc(p1, i1, descr=valuedescr)
-        escape(i1)
+        escape_n(i1)
         jump(p1, i1)
         """
         self.optimize_loop(ops, expected)
@@ -1329,14 +1329,14 @@
         setfield_gc(p1, i1, descr=valuedescr)
         setfield_gc(p2, p1, descr=nextdescr)
         i2 = getfield_gc_i(p1, descr=valuedescr)
-        escape(i2)
+        escape_n(i2)
         jump(p1, p2, i1)
         """
         expected = """
         [p1, p2, i1]
         setfield_gc(p1, i1, descr=valuedescr)
         setfield_gc(p2, p1, descr=nextdescr)
-        escape(i1)
+        escape_n(i1)
         jump(p1, p2, i1)
         """
         self.optimize_loop(ops, expected)
@@ -1347,7 +1347,7 @@
         setfield_gc(p1, i1, descr=valuedescr)
         setfield_gc(p2, i2, descr=valuedescr)
         i3 = getfield_gc_i(p1, descr=valuedescr)
-        escape(i3)
+        escape_n(i3)
         jump(p1, p2, i1, i3)
         """
         self.optimize_loop(ops, ops)
@@ -1358,16 +1358,16 @@
         i1 = getfield_gc_i(p1, descr=valuedescr)
         debug_merge_point(15, 0)
         i2 = getfield_gc_i(p1, descr=valuedescr)
-        escape(i1)
-        escape(i2)
+        escape_n(i1)
+        escape_n(i2)
         jump(p1)
         """
         expected = """
         [p1]
         i1 = getfield_gc_i(p1, descr=valuedescr)
         debug_merge_point(15, 0)
-        escape(i1)
-        escape(i1)
+        escape_n(i1)
+        escape_n(i1)
         jump(p1)
         """
         self.optimize_loop(ops, expected)
@@ -1379,8 +1379,8 @@
         i2 = int_add_ovf(i1, 14)
         guard_no_overflow() []
         i3 = getfield_gc_i(p1, descr=valuedescr)
-        escape(i2)
-        escape(i3)
+        escape_n(i2)
+        escape_n(i3)
         jump(p1)
         """
         expected = """
@@ -1388,8 +1388,8 @@
         i1 = getfield_gc_i(p1, descr=valuedescr)
         i2 = int_add_ovf(i1, 14)
         guard_no_overflow() []
-        escape(i2)
-        escape(i1)
+        escape_n(i2)
+        escape_n(i1)
         jump(p1)
         """
         self.optimize_loop(ops, expected)
@@ -1400,16 +1400,16 @@
         i1 = getfield_gc_i(p1, descr=valuedescr)
         setarrayitem_gc(p2, 0, p1, descr=arraydescr2)
         i3 = getfield_gc_i(p1, descr=valuedescr)
-        escape(i1)
-        escape(i3)
+        escape_n(i1)
+        escape_n(i3)
         jump(p1, p2)
         """
         expected = """
         [p1, p2]
         i1 = getfield_gc_i(p1, descr=valuedescr)
         setarrayitem_gc(p2, 0, p1, descr=arraydescr2)
-        escape(i1)
-        escape(i1)
+        escape_n(i1)
+        escape_n(i1)
         jump(p1, p2)
         """
         self.optimize_loop(ops, expected)
@@ -1419,15 +1419,15 @@
         []
         i1 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
         i2 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
-        escape(i1)
-        escape(i2)
+        escape_n(i1)
+        escape_n(i2)
         jump()
         """
         expected = """
         []
         i1 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
-        escape(i1)
-        escape(i1)
+        escape_n(i1)
+        escape_n(i1)
         jump()
         """
         self.optimize_loop(ops, expected)
@@ -1438,15 +1438,15 @@
         guard_value(p1, ConstPtr(myptr)) []
         i1 = getfield_gc_i(p1, descr=valuedescr)
         i2 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
-        escape(i1)
-        escape(i2)
+        escape_n(i1)
+        escape_n(i2)
         jump(p1)
         """
         expected = """
         []
         i1 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
-        escape(i1)
-        escape(i1)
+        escape_n(i1)
+        escape_n(i1)
         jump()
         """
         py.test.skip("XXX")
@@ -1456,10 +1456,10 @@
         ops = """
         [p1]
         i1 = getfield_gc_i(p1, descr=valuedescr)
-        escape()
+        escape_n()
         i2 = getfield_gc_i(p1, descr=valuedescr)
-        escape(i1)
-        escape(i2)
+        escape_n(i1)
+        escape_n(i2)
         jump(p1)
         """
         self.optimize_loop(ops, ops)
@@ -1468,9 +1468,9 @@
         ops = """
         [p1, i1]
         setfield_gc(p1, i1, descr=valuedescr)
-        escape()
+        escape_n()
         i2 = getfield_gc_i(p1, descr=valuedescr)
-        escape(i2)
+        escape_n(i2)
         jump(p1, i1)
         """
         self.optimize_loop(ops, ops)
@@ -1495,13 +1495,13 @@
         setfield_gc(p1, i1, descr=valuedescr)
         i2 = getfield_gc_i(p1, descr=valuedescr)
         setfield_gc(p1, i3, descr=valuedescr)
-        escape(i2)
+        escape_n(i2)
         jump(p1, i1, i3)
         """
         expected = """
         [p1, i1, i3]
         setfield_gc(p1, i3, descr=valuedescr)
-        escape(i1)
+        escape_n(i1)
         jump(p1, i1, i3)
         """
         self.optimize_loop(ops, expected)
@@ -1512,7 +1512,7 @@
         setfield_gc(p1, i1, descr=valuedescr)
         i2 = getfield_gc_i(p2, descr=valuedescr)
         setfield_gc(p1, i3, descr=valuedescr)
-        escape(i2)
+        escape_n(i2)
         jump(p1, p2, i1, i3)
         """
         # potential aliasing of p1 and p2 means that we cannot kill the
@@ -1558,14 +1558,14 @@
         p2 = getfield_gc_r(p0, descr=nextdescr)
         i2 = getfield_gc_i(p2, descr=valuedescr)
         setfield_gc(p0, NULL, descr=nextdescr)
-        escape(i2)
+        escape_n(i2)
         jump(p0, i1)
         """
         expected = """
         [p0, i1]
         setfield_raw(i1, i1, descr=valuedescr)
         setfield_gc(p0, NULL, descr=nextdescr)
-        escape(i1)
+        escape_n(i1)
         jump(p0, i1)
         """
         self.optimize_loop(ops, expected)
@@ -1574,7 +1574,7 @@
         ops = """
         [p1, i1, i2]
         setfield_gc(p1, i1, descr=valuedescr)
-        escape()
+        escape_n()
         setfield_gc(p1, i2, descr=valuedescr)
         jump(p1, i1, i2)
         """
@@ -1691,20 +1691,20 @@
         p3 = getarrayitem_gc_r(p1, 1, descr=arraydescr2)
         p4 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
         p5 = getarrayitem_gc_r(p1, 1, descr=arraydescr2)
-        escape(p2)
-        escape(p3)
-        escape(p4)
-        escape(p5)
+        escape_n(p2)
+        escape_n(p3)
+        escape_n(p4)
+        escape_n(p5)
         jump(p1)
         """
         expected = """
         [p1]
         p2 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
         p3 = getarrayitem_gc_r(p1, 1, descr=arraydescr2)
-        escape(p2)
-        escape(p3)
-        escape(p2)
-        escape(p3)
+        escape_n(p2)
+        escape_n(p3)
+        escape_n(p2)
+        escape_n(p3)
         jump(p1)
         """
         self.optimize_loop(ops, expected)
@@ -1714,13 +1714,13 @@
         [p1, p2]
         setarrayitem_gc(p1, 0, p2, descr=arraydescr2)
         p3 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
-        escape(p3)
+        escape_n(p3)
         jump(p1, p3)
         """
         expected = """
         [p1, p2]
         setarrayitem_gc(p1, 0, p2, descr=arraydescr2)
-        escape(p2)
+        escape_n(p2)
         jump(p1, p2)
         """
         self.optimize_loop(ops, expected)
@@ -1733,8 +1733,8 @@
         setarrayitem_gc(p1, i1, p3, descr=arraydescr2)
         p4 = getarrayitem_gc(p1, 0, descr=arraydescr2)
         p5 = getarrayitem_gc(p1, i1, descr=arraydescr2)
-        escape(p4)
-        escape(p5)
+        escape_n(p4)
+        escape_n(p5)
         jump(p1, p2, p3, i1)
         """
         expected = """
@@ -1742,8 +1742,8 @@
         setarrayitem_gc(p1, 0, p2, descr=arraydescr2)
         setarrayitem_gc(p1, i1, p3, descr=arraydescr2)
         p4 = getarrayitem_gc(p1, 0, descr=arraydescr2)
-        escape(p4)
-        escape(p3)
+        escape_n(p4)
+        escape_n(p3)
         jump(p1, p2, p3, i1)
         """
         self.optimize_loop(ops, expected)
@@ -1757,9 +1757,9 @@
         p5 = getarrayitem_gc_r(p1, i1, descr=arraydescr2)
         p6 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
         p7 = getarrayitem_gc_r(p1, 1, descr=arraydescr2)
-        escape(p5)
-        escape(p6)
-        escape(p7)
+        escape_n(p5)
+        escape_n(p6)
+        escape_n(p7)
         jump(p1, p2, p3, p4, i1)
         """
         expected = """
@@ -1768,9 +1768,9 @@
         setarrayitem_gc(p1, 0, p3, descr=arraydescr2)
         setarrayitem_gc(p1, 1, p4, descr=arraydescr2)
         p5 = getarrayitem_gc_r(p1, i1, descr=arraydescr2)
-        escape(p5)
-        escape(p3)
-        escape(p4)
+        escape_n(p5)
+        escape_n(p3)
+        escape_n(p4)
         jump(p1, p2, p3, p4, i1)
         """
         self.optimize_loop(ops, expected)
@@ -1781,17 +1781,17 @@
         p3 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
         i4 = getfield_gc_pure_i(ConstPtr(myptr), descr=valuedescr)
         p5 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
-        escape(p3)
-        escape(i4)
-        escape(p5)
+        escape_n(p3)
+        escape_n(i4)
+        escape_n(p5)
         jump(p1, p2)
         """
         expected = """
         [p1, p2]
         p3 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
-        escape(p3)
-        escape(5)
-        escape(p3)
+        escape_n(p3)
+        escape_n(5)
+        escape_n(p3)
         jump(p1, p2)
         """
         self.optimize_loop(ops, expected)
@@ -1803,16 +1803,16 @@
         setarrayitem_gc(p2, 1, p4, descr=arraydescr2)
         p5 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
         p6 = getarrayitem_gc_r(p2, 1, descr=arraydescr2)
-        escape(p5)
-        escape(p6)
+        escape_n(p5)
+        escape_n(p6)
         jump(p1, p2, p3, p4, i1)
         """
         expected = """
         [p1, p2, p3, p4, i1]
         setarrayitem_gc(p1, 0, p3, descr=arraydescr2)
         setarrayitem_gc(p2, 1, p4, descr=arraydescr2)
-        escape(p3)
-        escape(p4)
+        escape_n(p3)
+        escape_n(p4)
         jump(p1, p2, p3, p4, i1)
         """
         self.optimize_loop(ops, expected)
@@ -1864,19 +1864,19 @@
         [i0, p1]
         p4 = getfield_gc_r(p1, descr=nextdescr)
         guard_nonnull(p4) []
-        escape(p4)
+        escape_n(p4)
         #
         p2 = new_with_vtable(ConstClass(node_vtable))
-        p3 = escape()
+        p3 = escape_r()
         setfield_gc(p2, p3, descr=nextdescr)
         jump(i0, p2)
         """
         expected = """
         [i0, p4]
         guard_nonnull(p4) []
-        escape(p4)
+        escape_n(p4)
         #
-        p3 = escape()
+        p3 = escape_r()
         jump(i0, p3)
         """
         py.test.skip("XXX")
@@ -1888,19 +1888,19 @@
         [i0, p1]
         p4 = getarrayitem_gc(p1, 0, descr=arraydescr2)
         guard_nonnull(p4) []
-        escape(p4)
+        escape_n(p4)
         #
         p2 = new_array(1, descr=arraydescr2)
-        p3 = escape()
+        p3 = escape_r()
         setarrayitem_gc(p2, 0, p3, descr=arraydescr2)
         jump(i0, p2)
         """
         expected = """
         [i0, p4]
         guard_nonnull(p4) []
-        escape(p4)
+        escape_n(p4)
         #
-        p3 = escape()
+        p3 = escape_r()
         jump(i0, p3)
         """
         py.test.skip("XXX")
@@ -1922,7 +1922,7 @@
         p1a = new_with_vtable(ConstClass(node_vtable2))
         p2a = new_with_vtable(ConstClass(node_vtable))
         p3a = new_with_vtable(ConstClass(node_vtable))
-        escape(p3a)
+        escape_n(p3a)
         setfield_gc(p1a, p2a, descr=nextdescr)
         setfield_gc(p1a, p3a, descr=otherdescr)
         jump(p1a)
@@ -1933,7 +1933,7 @@
         guard_class(p3, ConstClass(node_vtable)) []
         setfield_gc(p3, p2, descr=otherdescr)
         p3a = new_with_vtable(ConstClass(node_vtable))
-        escape(p3a)
+        escape_n(p3a)
         p2a = new_with_vtable(ConstClass(node_vtable))
         jump(p2a, p3a)
         """
@@ -1955,7 +1955,7 @@
         p2a = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p3, p2a, descr=otherdescr)
         p3a = new_with_vtable(ConstClass(node_vtable))
-        escape(p3a)
+        escape_n(p3a)
         setfield_gc(p1a, p2a, descr=nextdescr)
         setfield_gc(p1a, p3a, descr=otherdescr)
         jump(p1a)
@@ -1967,7 +1967,7 @@
         p2a = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p3, p2a, descr=otherdescr)
         p3a = new_with_vtable(ConstClass(node_vtable))
-        escape(p3a)
+        escape_n(p3a)
         jump(p2a, p3a)
         """
         py.test.skip("XXX")
@@ -1992,7 +1992,7 @@
         guard_class(p1, ConstClass(node_vtable2)) []
         #
         p2 = new_with_vtable(ConstClass(node_vtable))
-        escape(p2)      # prevent it from staying Virtual
+        escape_n(p2)      # prevent it from staying Virtual
         jump(p2)
         """
         py.test.raises(InvalidLoop, self.optimize_loop,
@@ -2128,8 +2128,8 @@
         i4 = int_add(i2, 1)
         i4b = int_is_true(i4)
         guard_true(i4b) []
-        escape(i3)
-        escape(i4)
+        escape_n(i3)
+        escape_n(i4)
         guard_true(i1) []
         guard_true(i2) []
         jump(p1, p2)
@@ -2140,8 +2140,8 @@
         i3 = int_add(i1, 1)
         i3b = int_is_true(i3)
         guard_true(i3b) []
-        escape(i3)
-        escape(i3)
+        escape_n(i3)
+        escape_n(i3)
         guard_true(i1) []
         jump(p1, p2)
         """
@@ -2178,8 +2178,8 @@
         guard_no_overflow() []
         i4b = int_is_true(i4)
         guard_true(i4b) []
-        escape(i3)
-        escape(i4)
+        escape_n(i3)
+        escape_n(i4)
         jump(i1)
         """
         expected = """
@@ -2188,8 +2188,8 @@
         guard_no_overflow() []
         i3b = int_is_true(i3)
         guard_true(i3b) []
-        escape(i3)
-        escape(i3)
+        escape_n(i3)
+        escape_n(i3)
         jump(i1)
         """
         self.optimize_loop(ops, expected)
@@ -2295,12 +2295,12 @@
         ops = """
         [f0]
         f1 = float_mul(f0, 1.0)
-        f2 = escape(f1)
+        f2 = escape_f(f1)
         jump(f2)
         """
         expected = """
         [f0]
-        f2 = escape(f0)
+        f2 = escape_f(f0)
         jump(f2)
         """
         self.optimize_loop(ops, expected)
@@ -2308,12 +2308,12 @@
         ops = """
         [f0]
         f1 = float_mul(1.0, f0)
-        f2 = escape(f1)
+        f2 = escape_f(f1)
         jump(f2)
         """
         expected = """
         [f0]
-        f2 = escape(f0)
+        f2 = escape_f(f0)
         jump(f2)
         """
         self.optimize_loop(ops, expected)
@@ -2322,13 +2322,13 @@
         ops = """
         [f0]
         f1 = float_mul(f0, -1.0)
-        f2 = escape(f1)
+        f2 = escape_f(f1)
         jump(f2)
         """
         expected = """
         [f0]
         f1 = float_neg(f0)
-        f2 = escape(f1)
+        f2 = escape_f(f1)
         jump(f2)
         """
         self.optimize_loop(ops, expected)
@@ -2336,13 +2336,13 @@
         ops = """
         [f0]
         f1 = float_mul(-1.0, f0)
-        f2 = escape(f1)
+        f2 = escape_f(f1)
         jump(f2)
         """
         expected = """
         [f0]
         f1 = float_neg(f0)
-        f2 = escape(f1)
+        f2 = escape_f(f1)
         jump(f2)
         """
         self.optimize_loop(ops, expected)
@@ -2354,14 +2354,14 @@
         f2 = float_neg(f1)
         f3 = float_neg(f2)
         f4 = float_neg(f3)
-        escape(f4)
+        escape_n(f4)
         jump(f4)
         """
         expected = """
         [f0]
         # The backend removes this dead op.
         f1 = float_neg(f0)
-        escape(f0)
+        escape_n(f0)
         jump(f0)
         """
         self.optimize_loop(ops, expected)
@@ -2373,7 +2373,7 @@
         f2 = float_truediv(f1, 3.0)
         f3 = float_truediv(f2, -0.25)
         f4 = float_truediv(f3, 0.0)
-        f5 = escape(f4)
+        f5 = escape_f(f4)
         jump(f5)
         """
 
@@ -2383,7 +2383,7 @@
         f2 = float_truediv(f1, 3.0)
         f3 = float_mul(f2, -4.0)
         f4 = float_truediv(f3, 0.0)
-        f5 = escape(f4)
+        f5 = escape_f(f4)
         jump(f5)
         """
         self.optimize_loop(ops, expected)
@@ -2770,16 +2770,16 @@
         i1 = getfield_gc_i(p1, descr=valuedescr)
         i2 = call_i(i1, descr=nonwritedescr)
         i3 = getfield_gc_i(p1, descr=valuedescr)
-        escape(i1)
-        escape(i3)
+        escape_n(i1)
+        escape_n(i3)
         jump(p1, p2)
         """
         expected = """
         [p1, p2]
         i1 = getfield_gc_i(p1, descr=valuedescr)
         i2 = call_i(i1, descr=nonwritedescr)
-        escape(i1)
-        escape(i1)
+        escape_n(i1)
+        escape_n(i1)
         jump(p1, p2)
         """
         self.optimize_loop(ops, expected)
@@ -2792,10 +2792,10 @@
         i3 = call_i(i1, descr=writeadescr)
         i4 = getfield_gc_i(p1, descr=adescr)
         i5 = getfield_gc_i(p1, descr=bdescr)
-        escape(i1)
-        escape(i2)
-        escape(i4)
-        escape(i5)
+        escape_n(i1)
+        escape_n(i2)
+        escape_n(i4)
+        escape_n(i5)
         jump(p1, p2)
         """
         expected = """
@@ -2804,10 +2804,10 @@
         i2 = getfield_gc_i(p1, descr=bdescr)
         i3 = call_i(i1, descr=writeadescr)
         i4 = getfield_gc_i(p1, descr=adescr)
-        escape(i1)
-        escape(i2)
-        escape(i4)
-        escape(i2)
+        escape_n(i1)
+        escape_n(i2)
+        escape_n(i4)
+        escape_n(i2)
         jump(p1, p2)
         """
         self.optimize_loop(ops, expected)
@@ -2820,10 +2820,10 @@
         i3 = call_i(i1, descr=writeadescr)
         p5 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
         p6 = getarrayitem_gc_r(p2, 1, descr=arraydescr2)
-        escape(p3)
-        escape(p4)
-        escape(p5)
-        escape(p6)
+        escape_n(p3)
+        escape_n(p4)
+        escape_n(p5)
+        escape_n(p6)
         jump(p1, p2, i1)
         """
         expected = """
@@ -2831,10 +2831,10 @@
         p3 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
         p4 = getarrayitem_gc_r(p2, 1, descr=arraydescr2)
         i3 = call_i(i1, descr=writeadescr)
-        escape(p3)
-        escape(p4)
-        escape(p3)
-        escape(p4)
+        escape_n(p3)
+        escape_n(p4)
+        escape_n(p3)
+        escape_n(p4)
         jump(p1, p2, i1)
         """
         self.optimize_loop(ops, expected)
@@ -2849,12 +2849,12 @@
         p5 = getarrayitem_gc_r(p2, 0, descr=arraydescr2)
         p6 = getarrayitem_gc_r(p2, 1, descr=arraydescr2)
         i4 = getarrayitem_gc_i(p1, 1, descr=arraydescr)
-        escape(p3)
-        escape(p4)
-        escape(p5)
-        escape(p6)
-        escape(i2)
-        escape(i4)
+        escape_n(p3)
+        escape_n(p4)
+        escape_n(p5)
+        escape_n(p6)
+        escape_n(i2)
+        escape_n(i4)
         jump(p1, p2, i1)
         """
         expected = """
@@ -2864,12 +2864,12 @@
         i2 = getarrayitem_gc_i(p1, 1, descr=arraydescr)
         i3 = call_i(i1, descr=writearraydescr)
         i4 = getarrayitem_gc_i(p1, 1, descr=arraydescr)
-        escape(p3)
-        escape(p4)
-        escape(p3)
-        escape(p4)
-        escape(i2)
-        escape(i4)
+        escape_n(p3)
+        escape_n(p4)
+        escape_n(p3)
+        escape_n(p4)
+        escape_n(i2)
+        escape_n(i4)
         jump(p1, p2, i1)
         """
         self.optimize_loop(ops, expected)
@@ -2964,16 +2964,16 @@
         call_pure_results = {tuple(arg_consts): ConstInt(42)}
         ops = '''
         [i0, i1, i2]
-        escape(i1)
-        escape(i2)
+        escape_n(i1)
+        escape_n(i2)
         i3 = call_pure_i(123456, 4, 5, 6, descr=plaincalldescr)
         i4 = call_pure_i(123456, 4, i0, 6, descr=plaincalldescr)
         jump(i0, i3, i4)
         '''
         expected = '''
         [i0, i1, i2]
-        escape(i1)
-        escape(i2)
+        escape_n(i1)
+        escape_n(i2)
         i4 = call_i(123456, 4, i0, 6, descr=plaincalldescr)
         jump(i0, 42, i4)
         '''
@@ -2997,7 +2997,7 @@
         ops = """
         [p1]
         p2 = virtual_ref(p1, 5)
-        escape(p2)
+        escape_n(p2)
         virtual_ref_finish(p2, p1)
         jump(p1)
         """
@@ -3007,7 +3007,7 @@
         p2 = new_with_vtable(ConstClass(jit_virtual_ref_vtable))
         setfield_gc(p2, NULL, descr=virtualforceddescr)
         setfield_gc(p2, p0, descr=virtualtokendescr)
-        escape(p2)
+        escape_n(p2)
         setfield_gc(p2, p1, descr=virtualforceddescr)
         setfield_gc(p2, NULL, descr=virtualtokendescr)
         jump(p1)
@@ -3146,7 +3146,7 @@
         [i1]
         p1 = new_with_vtable(ConstClass(node_vtable))
         p2 = virtual_ref(p1, 7)
-        escape(p2)
+        escape_n(p2)
         virtual_ref_finish(p2, p1)
         call_may_force_n(i1, descr=mayforcevirtdescr)
         guard_not_forced() []
@@ -3158,7 +3158,7 @@
         p2 = new_with_vtable(ConstClass(jit_virtual_ref_vtable))
         setfield_gc(p2, NULL, descr=virtualforceddescr)
         setfield_gc(p2, p3, descr=virtualtokendescr)
-        escape(p2)
+        escape_n(p2)
         p1 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p2, p1, descr=virtualforceddescr)
         setfield_gc(p2, NULL, descr=virtualtokendescr)
@@ -3172,7 +3172,7 @@
         ops = """
         [i1, p1]
         p2 = virtual_ref(p1, 23)
-        escape(p2)
+        escape_n(p2)
         virtual_ref_finish(p2, p1)
         call_may_force_n(i1, descr=mayforcevirtdescr)
         guard_not_forced() [i1]
@@ -3184,7 +3184,7 @@
         p2 = new_with_vtable(ConstClass(jit_virtual_ref_vtable))
         setfield_gc(p2, NULL, descr=virtualforceddescr)
         setfield_gc(p2, p3, descr=virtualtokendescr)
-        escape(p2)
+        escape_n(p2)
         setfield_gc(p2, p1, descr=virtualforceddescr)
         setfield_gc(p2, NULL, descr=virtualtokendescr)
         call_may_force_n(i1, descr=mayforcevirtdescr)
@@ -4235,12 +4235,12 @@
         p1 = same_as_r(s"ab")
         p2 = same_as_r(s"cde")
         p3 = call_r(0, p1, p2, descr=strconcatdescr)
-        escape(p3)
+        escape_n(p3)
         jump()
         """
         expected = """
         []
-        escape(s"abcde")
+        escape_n(s"abcde")
         jump()
         """
         self.optimize_strunicode_loop(ops, expected)
@@ -4329,7 +4329,7 @@
         [p1, i1, i2, i3]
         p2 = call_r(0, p1, i1, i2, descr=strslicedescr)
         i4 = strgetitem(p2, i3)
-        escape(i4)
+        escape_n(i4)
         jump(p1, i1, i2, i3)
         """
         expected = """
@@ -4337,7 +4337,7 @@
         i6 = int_sub(i2, i1)      # killed by the backend
         i5 = int_add(i1, i3)
         i4 = strgetitem(p1, i5)
-        escape(i4)
+        escape_n(i4)
         jump(p1, i1, i2, i3)
         """
         self.optimize_strunicode_loop(ops, expected)
@@ -4350,12 +4350,12 @@
         strsetitem(p1, 1, i4)
         p2 = call_r(0, p1, 1, 2, descr=strslicedescr)
         i5 = strgetitem(p2, 0)
-        escape(i5)
+        escape_n(i5)
         jump(i3, i4)
         """
         expected = """
         [i3, i4]
-        escape(i4)
+        escape_n(i4)
         jump(i3, i4)
         """
         self.optimize_strunicode_loop(ops, expected)
@@ -4416,7 +4416,7 @@
         ops = """
         [p1, p2]
         i0 = call_i(0, p1, p2, descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(p1, p2)
         """
         self.optimize_strunicode_loop_extradescrs(ops, ops)
@@ -4426,7 +4426,7 @@
         [p1, p2, p3]
         p4 = call_r(0, p1, p2, descr=strconcatdescr)
         i0 = call_i(0, p3, p4, descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(p1, p2, p3)
         """
         expected = """
@@ -4438,7 +4438,7 @@
         copystrcontent(p1, p4, 0, 0, i1)
         copystrcontent(p2, p4, 0, i1, i2)
         i0 = call_i(0, p3, p4, descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(p1, p2, p3)
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4448,14 +4448,14 @@
         [p1, i1, i2, p3]
         p4 = call_r(0, p1, i1, i2, descr=strslicedescr)
         i0 = call_i(0, p4, p3, descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(p1, i1, i2, p3)
         """
         expected = """
         [p1, i1, i2, p3]
         i3 = int_sub(i2, i1)
         i0 = call_i(0, p1, i1, i3, p3, descr=streq_slice_checknull_descr)
-        escape(i0)
+        escape_n(i0)
         jump(p1, i1, i2, p3)
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4465,14 +4465,14 @@
         [p1, i1, i2, p3]
         p4 = call_r(0, p1, i1, i2, descr=strslicedescr)
         i0 = call_i(0, p3, p4, descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(p1, i1, i2, p3)
         """
         expected = """
         [p1, i1, i2, p3]
         i4 = int_sub(i2, i1)
         i0 = call_i(0, p1, i1, i4, p3, descr=streq_slice_checknull_descr)
-        escape(i0)
+        escape_n(i0)
         jump(p1, i1, i2, p3)
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4483,7 +4483,7 @@
         guard_nonnull(p3) []
         p4 = call_r(0, p1, i1, i2, descr=strslicedescr)
         i0 = call_i(0, p3, p4, descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(p1, i1, i2, p3)
         """
         expected = """
@@ -4491,7 +4491,7 @@
         guard_nonnull(p3) []
         i4 = int_sub(i2, i1)
         i0 = call_i(0, p1, i1, i4, p3, descr=streq_slice_nonnull_descr)
-        escape(i0)
+        escape_n(i0)
         jump(p1, i1, i2, p3)
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4501,14 +4501,14 @@
         [p1, i1, i2]
         p3 = call_r(0, p1, i1, i2, descr=strslicedescr)
         i0 = call_i(0, p3, s"x", descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(p1, i1, i2)
         """
         expected = """
         [p1, i1, i2]
         i3 = int_sub(i2, i1)
         i0 = call_i(0, p1, i1, i3, 120, descr=streq_slice_char_descr)
-        escape(i0)
+        escape_n(i0)
         jump(p1, i1, i2)
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4520,14 +4520,14 @@
         p5 = newstr(1)
         strsetitem(p5, 0, i3)
         i0 = call_i(0, p5, p4, descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(p1, i1, i2, i3)
         """
         expected = """
         [p1, i1, i2, i3]
         i4 = int_sub(i2, i1)
         i0 = call_i(0, p1, i1, i4, i3, descr=streq_slice_char_descr)
-        escape(i0)
+        escape_n(i0)
         jump(p1, i1, i2, i3)
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4536,13 +4536,13 @@
         ops = """
         [p1]
         i0 = call_i(0, p1, NULL, descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(p1)
         """
         expected = """
         [p1]
         i0 = ptr_eq(p1, NULL)
-        escape(i0)
+        escape_n(i0)
         jump(p1)
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4551,13 +4551,13 @@
         ops = """
         [p1]
         i0 = call_i(0, NULL, p1, descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(p1)
         """
         expected = """
         [p1]
         i0 = ptr_eq(p1, NULL)
-        escape(i0)
+        escape_n(i0)
         jump(p1)
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4567,14 +4567,14 @@
         [p1]
         guard_nonnull(p1) []
         i0 = call_i(0, p1, s"hello world", descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(p1)
         """
         expected = """
         [p1]
         guard_nonnull(p1) []
         i0 = call_i(0, p1, s"hello world", descr=streq_nonnull_descr)
-        escape(i0)
+        escape_n(i0)
         jump(p1)
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4584,7 +4584,7 @@
         [p1]
         guard_nonnull(p1) []
         i0 = call_i(0, p1, s"", descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(p1)
         """
         expected = """
@@ -4592,7 +4592,7 @@
         guard_nonnull(p1) []
         i1 = strlen(p1)
         i0 = int_eq(i1, 0)
-        escape(i0)
+        escape_n(i0)
         jump(p1)
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4602,14 +4602,14 @@
         [p1]
         guard_nonnull(p1) []
         i0 = call_i(0, p1, s"x", descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(p1)
         """
         expected = """
         [p1]
         guard_nonnull(p1) []
         i0 = call_i(0, p1, 120, descr=streq_nonnull_char_descr)
-        escape(i0)
+        escape_n(i0)
         jump(p1)
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4619,7 +4619,7 @@
         [p1, p2]
         p4 = call_r(0, p1, p2, descr=strconcatdescr)
         i0 = call_i(0, s"hello world", p4, descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(p1, p2)
         """
         expected = """
@@ -4631,7 +4631,7 @@
         copystrcontent(p1, p4, 0, 0, i1)
         copystrcontent(p2, p4, 0, i1, i2)
         i0 = call_i(0, s"hello world", p4, descr=streq_nonnull_descr)
-        escape(i0)
+        escape_n(i0)
         jump(p1, p2)
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4641,12 +4641,12 @@
         [i1]
         p1 = newstr(0)
         i0 = call_i(0, p1, s"", descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(i1)
         """
         expected = """
         [i1]
-        escape(1)
+        escape_n(1)
         jump(i1)
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4657,13 +4657,13 @@
         p1 = newstr(1)
         strsetitem(p1, 0, i1)
         i0 = call_i(0, p1, s"x", descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(i1)
         """
         expected = """
         [i1]
         i0 = int_eq(i1, 120)     # ord('x')
-        escape(i0)
+        escape_n(i0)
         jump(i1)
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4675,7 +4675,7 @@
         strsetitem(p1, 0, i1)
         strsetitem(p1, 1, i2)
         i0 = call_i(0, p1, s"xy", descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(i1, i2)
         """
         expected = """
@@ -4684,7 +4684,7 @@
         strsetitem(p1, 0, i1)
         strsetitem(p1, 1, i2)
         i0 = call_i(0, p1, s"xy", descr=streq_lengthok_descr)
-        escape(i0)
+        escape_n(i0)
         jump(i1, i2)
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4693,13 +4693,13 @@
         ops = """
         [p1]
         i0 = call_i(0, s"x", p1, descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(p1)
         """
         expected = """
         [p1]
         i0 = call_i(0, p1, 120, descr=streq_checknull_char_descr)
-        escape(i0)
+        escape_n(i0)
         jump(p1)
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4710,12 +4710,12 @@
         p1 = newstr(1)
         strsetitem(p1, 0, i1)
         i0 = call_i(0, s"xy", p1, descr=strequaldescr)
-        escape(i0)
+        escape_n(i0)
         jump(i1)
         """
         expected = """
         [i1]
-        escape(0)
+        escape_n(0)
         jump(i1)
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4724,12 +4724,12 @@
         ops = """
         []
         p0 = call_r(0, "xy", descr=s2u_descr)      # string -> unicode
-        escape(p0)
+        escape_n(p0)
         jump()
         """
         expected = """
         []
-        escape(u"xy")
+        escape_n(u"xy")
         jump()
         """
         self.optimize_strunicode_loop_extradescrs(ops, expected)
@@ -4738,7 +4738,7 @@
         ops = """
         [p0]
         p1 = call_r(0, p0, descr=s2u_descr)      # string -> unicode
-        escape(p1)
+        escape_n(p1)
         jump(p1)
         """
         self.optimize_strunicode_loop_extradescrs(ops, ops)
@@ -4753,13 +4753,13 @@
         i2 = strgetitem(p0, i0)
         i3 = int_eq(i1, i2)
         guard_true(i3) []
-        escape(i2)
+        escape_n(i2)
         jump(p0, i0)
         """
         expected = """
         [p0, i0]
         i1 = strgetitem(p0, i0)
-        escape(i1)
+        escape_n(i1)
         jump(p0, i0)
         """
         self.optimize_strunicode_loop(ops, expected)
@@ -4788,7 +4788,7 @@
         [p0, i0]
         i1 = int_add(i0, 1)
         p1 = call_r(0, p0, i0, i1, descr=strslicedescr)
-        escape(p1)
+        escape_n(p1)
         jump(p0, i1)
         """
         expected = """
@@ -4797,7 +4797,7 @@
         p1 = newstr(1)
         i2 = strgetitem(p0, i0)
         strsetitem(p1, 0, i2)
-        escape(p1)
+        escape_n(p1)
         jump(p0, i1)
         """
         self.optimize_strunicode_loop(ops, expected)
@@ -4841,7 +4841,7 @@
         ops = """
         [i0]
         p0 = newstr(i0)
-        escape(p0)
+        escape_n(p0)
         i1 = strlen(p0)
         i2 = int_add(i1, 1)
         jump(i2)
@@ -4849,7 +4849,7 @@
         expected = """
         [i0]
         p0 = newstr(i0)
-        escape(p0)
+        escape_n(p0)
         i1 = int_add(i0, 1)
         jump(i1)
         """
@@ -5009,8 +5009,8 @@
         [i0, i1]
         p0 = new(descr=ssize)
         p1 = new(descr=ssize)
-        escape(p0)
-        escape(p1)
+        escape_n(p0)
+        escape_n(p1)
         setfield_gc(p0, i0, descr=adescr)
         setfield_gc(p1, i1, descr=adescr)
         i2 = getfield_gc_i(p0, descr=adescr)
@@ -5019,9 +5019,9 @@
         expected = """
         [i0, i1]
         p0 = new(descr=ssize)
-        escape(p0)
+        escape_n(p0)
         p1 = new(descr=ssize)
-        escape(p1)
+        escape_n(p1)
         setfield_gc(p0, i0, descr=adescr)
         setfield_gc(p1, i1, descr=adescr)
         jump(i0, i0)
@@ -5192,14 +5192,14 @@
         p1 = newstr(1)
         strsetitem(p1, 0, i0)
         p2 = newstr(1)
-        escape(p2)
+        escape_n(p2)
         copystrcontent(p1, p2, 0, 0, 1)
         finish()
         """
         expected = """
         [i0]
         p2 = newstr(1)
-        escape(p2)
+        escape_n(p2)
         strsetitem(p2, 0, i0)
         finish()
         """
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
@@ -1,14 +1,15 @@
 import py
 from rpython.rlib.objectmodel import instantiate
 from rpython.jit.metainterp import compile, resume
-from rpython.jit.metainterp.history import AbstractDescr, ConstInt, BoxInt, TreeLoop
+from rpython.jit.metainterp.history import AbstractDescr, ConstInt, TreeLoop
 from rpython.jit.metainterp.optimize import InvalidLoop
 from rpython.jit.metainterp.optimizeopt import build_opt_chain
 from rpython.jit.metainterp.optimizeopt.test.test_util import (
     LLtypeMixin, BaseTest, convert_old_style_to_targets)
 from rpython.jit.metainterp.optimizeopt.test.test_optimizebasic import \
     FakeMetaInterpStaticData
-from rpython.jit.metainterp.resoperation import rop, opname, oparity
+from rpython.jit.metainterp.resoperation import rop, opname, oparity,\
+     InputArgInt
 
 
 def test_build_opt_chain():
@@ -134,10 +135,10 @@
     def test_simple(self):
         ops = """
         []
-        f = escape()
+        f = escape_f()
         f0 = float_sub(f, 1.0)
         guard_value(f0, 0.0) [f0]
-        escape(f)
+        escape_n(f)
         jump()
         """
         self.optimize_loop(ops, ops)
@@ -178,9 +179,9 @@
         self.optimize_loop(ops, expected)
 
     def test_constfold_all(self):
-        from rpython.jit.metainterp.executor import execute_nonspec
+        from rpython.jit.metainterp.executor import _execute_nonspec
         import random
-        for opnum in range(rop.INT_ADD, rop.SAME_AS+1):
+        for opnum in range(rop.INT_ADD, rop.SAME_AS_I+1):
             try:
                 op = opname[opnum]
             except KeyError:
@@ -193,15 +194,14 @@
             ops = """
             []
             i1 = %s(%s)
-            escape(i1)
+            escape_n(i1)
             jump()
             """ % (op.lower(), ', '.join(map(str, args)))
-            argboxes = [BoxInt(a) for a in args]
-            expected_value = execute_nonspec(self.cpu, None, opnum,
-                                             argboxes).getint()
+            argboxes = [InputArgInt(a) for a in args]
+            expected_value = _execute_nonspec(self.cpu, None, opnum, argboxes)
             expected = """
             []
-            escape(%d)
+            escape_n(%d)
             jump()
             """ % expected_value
             self.optimize_loop(ops, expected)
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
@@ -18,7 +18,7 @@
 from rpython.jit.metainterp.counter import DeterministicJitCounter
 from rpython.config.translationoption import get_combined_translation_config
 from rpython.jit.metainterp.resoperation import rop, ResOperation, InputArgRef
-from rpython.jit.metainterp.optimizeopt.unroll import Inliner
+
 
 def test_sort_descrs():
     class PseudoDescr(AbstractDescr):
@@ -343,9 +343,9 @@
         op.setfailargs(boxes)
     def __eq__(self, other):
         return type(self) is type(other)      # xxx obscure
-    def clone_if_mutable(self):
+    def clone_if_mutable(self, memo):
         res = Storage(self.metainterp_sd, self.original_greenkey)
-        self.copy_all_attributes_into(res)
+        self.copy_all_attributes_into(res, memo)
         return res
 
 def _sortboxes(boxes):
@@ -367,7 +367,7 @@
     def add_guard_future_condition(self, res):
         # invent a GUARD_FUTURE_CONDITION to not have to change all tests
         if res.operations[-1].getopnum() == rop.JUMP:
-            guard = ResOperation(rop.GUARD_FUTURE_CONDITION, [], None, descr=self.invent_fail_descr(None, -1, []))
+            guard = ResOperation(rop.GUARD_FUTURE_CONDITION, [], descr=self.invent_fail_descr(None, -1, []))
             res.operations.insert(-1, guard)
 
     def invent_fail_descr(self, model, opnum, fail_args):
@@ -414,7 +414,10 @@
 
         jump_args = jumpop.getarglist()[:]
         operations = operations[:-1]
-        cloned_operations = [op.clone() for op in operations]
+        memo = compile.Memo()
+        cloned_operations = [op.clone(memo) for op in operations]
+        for op in cloned_operations:
+            op.is_source_op = True
 
         preamble = TreeLoop('preamble')
         preamble.inputargs = inputargs
@@ -427,11 +430,10 @@
 
         assert preamble.operations[-1].getopnum() == rop.LABEL
 
-        inliner = Inliner(inputargs, jump_args)
         loop.operations = [preamble.operations[-1]] + \
-                          [inliner.inline_op(op, clone=False) for op in cloned_operations] + \
-                          [ResOperation(rop.JUMP, [inliner.inline_arg(a) for a in jump_args],
-                                        None, descr=token)]
+                          cloned_operations + \
+                          [ResOperation(rop.JUMP, [memo.get(a, a) for a in jump_args],
+                                        descr=token)]
                           #[inliner.inline_op(jumpop)]
         assert loop.operations[-1].getopnum() == rop.JUMP
         assert loop.operations[0].getopnum() == rop.LABEL
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,8 +1,7 @@
 import sys
 
-from rpython.jit.metainterp.compile import ResumeGuardDescr
+from rpython.jit.metainterp.compile import Memo
 from rpython.jit.metainterp.history import TargetToken, JitCellToken, Const
-from rpython.jit.metainterp.inliner import Inliner
 from rpython.jit.metainterp.optimize import InvalidLoop
 from rpython.jit.metainterp.optimizeopt.generalize import KillHugeIntBounds
 from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer, Optimization
@@ -115,7 +114,7 @@
 
             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(), None,
+                jumpop = ResOperation(rop.JUMP, stop_label.getarglist(),
                                       descr=start_label.getdescr())
                 if self.short:
                     # Construct our short preamble
@@ -318,9 +317,10 @@
                                       'end of this bridge does not do that.')
 
             args[short_inputargs[i]] = jmp_to_short_args[i]
-        self.short_inliner = Inliner(short_inputargs, jmp_to_short_args)
-        self._inline_short_preamble(self.short, self.short_inliner,
-                                    patchguardop, self.short_boxes.assumed_classes)
+        self.memo = Memo(short_inputargs, jmp_to_short_args)
+        self._inline_short_preamble(self.short, self.memo,
+                                    patchguardop,
+                                    self.short_boxes.assumed_classes)
 
         # Import boxes produced in the preamble but used in the loop
         newoperations = self.optimizer.get_newoperations()
@@ -341,7 +341,7 @@
 
         jumpop.initarglist(jumpargs)
         self.optimizer.send_extra_operation(jumpop)
-        self.short.append(ResOperation(rop.JUMP, short_jumpargs, None, descr=jumpop.getdescr()))
+        self.short.append(ResOperation(rop.JUMP, short_jumpargs, descr=jumpop.getdescr()))
 
         # Verify that the virtual state at the end of the loop is one
         # that is compatible with the virtual state at the start of the loop
@@ -397,21 +397,20 @@
             else:
                 newargs[i] = a.clonebox()
                 boxmap[a] = newargs[i]
-        inliner = Inliner(short_inputargs, newargs)
+        memo = Memo(short_inputargs, newargs)
         target_token.assumed_classes = {}
         for i in range(len(short)):
             op = short[i]
-            newop = inliner.inline_op(op)
-            if op.result and op.result in self.short_boxes.assumed_classes:
-                target_token.assumed_classes[newop.result] = self.short_boxes.assumed_classes[op.result]
+            newop = op.clone(memo)
+            if op.type != 'v' and op in self.short_boxes.assumed_classes:
+                target_token.assumed_classes[newop] = self.short_boxes.assumed_classes[op]
             short[i] = newop
 
         # Forget the values to allow them to be freed
         for box in short[0].getarglist():
             box.forget_value()
         for op in short:
-            if op.result:
-                op.result.forget_value()
+            op.forget_value()
         target_token.short_preamble = self.short
         target_token.exported_state = None
 
@@ -492,7 +491,7 @@
 
 
     def _import_op(self, op, inputargs, short_jumpargs, jumpargs):
-        self.boxes_created_this_iteration[op.result] = None
+        self.boxes_created_this_iteration[op] = None
         args = op.getarglist()
         if op.is_guard():
             args = args + op.getfailargs()
@@ -551,7 +550,7 @@
             args = target.virtual_state.make_inputargs(values, self.optimizer,
                                                        keyboxes=True)
             short_inputargs = target.short_preamble[0].getarglist()
-            inliner = Inliner(short_inputargs, args)
+            memo = Memo(short_inputargs, args)
 
             for guard in extra_guards:
                 if guard.is_guard():
@@ -561,7 +560,7 @@
 
             try:
                 # NB: the short_preamble ends with a jump
-                self._inline_short_preamble(target.short_preamble, inliner, patchguardop, target.assumed_classes)
+                self._inline_short_preamble(target.short_preamble, memo, patchguardop, target.assumed_classes)
             except InvalidLoop:
                 #debug_print("Inlining failed unexpectedly",
                 #            "jumping to preamble instead")
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -242,6 +242,9 @@
     def returns_bool_result(self):
         return self._cls_has_bool_result
 
+    def forget_value(self):
+        pass
+
 
 # ===================
 # Top of the hierachy
@@ -358,6 +361,9 @@
 
     getvalue = getref_base
 
+    def forget_value(self):
+        self._resref = lltype.nullptr(llmemory.GCREF.TO)
+
     def setref_base(self, refval):
         self._resref = refval
 
@@ -626,7 +632,7 @@
     'INT_INVERT/1/i',
     'INT_FORCE_GE_ZERO/1/i',
     #
-    'SAME_AS/1/rfi',      # gets a Const or a Box, turns it into another Box
+    'SAME_AS/1/ifr',      # gets a Const or a Box, turns it into another Box
     'CAST_PTR_TO_INT/1/i',
     'CAST_INT_TO_PTR/1/r',
     #
diff --git a/rpython/jit/tool/oparser.py b/rpython/jit/tool/oparser.py
--- a/rpython/jit/tool/oparser.py
+++ b/rpython/jit/tool/oparser.py
@@ -14,9 +14,6 @@
 
 class ESCAPE_OP(N_aryOp, ResOpWithDescr):
 
-    OPNUM = -123
-
-    type = 'i'
     is_source_op = True
 
     def getopnum(self):
@@ -25,14 +22,38 @@
     def getopname(self):
         return 'escape'
 
-    def clone(self):
-        op = ESCAPE_OP()
-        op.initarglist(self.getarglist()[:])
+    def clone(self, memo):
+        op = self.__class__()
+        op.initarglist([memo.get(arg, arg) for arg in self.getarglist()])
+        memo.set(self, op)
         return op
 
+class ESCAPE_OP_I(ESCAPE_OP):
+    type = 'i'
+    OPNUM = -123
+
+class ESCAPE_OP_F(ESCAPE_OP):
+    type = 'f'
+    OPNUM = -124
+
+class ESCAPE_OP_N(ESCAPE_OP):
+    type = 'v'
+    OPNUM = -125
+
+class ESCAPE_OP_R(ESCAPE_OP):
+    type = 'r'
+    OPNUM = -126
+
+ALL_ESCAPE_OPS = {
+    ESCAPE_OP_I.OPNUM: ESCAPE_OP_I,
+    ESCAPE_OP_F.OPNUM: ESCAPE_OP_F,
+    ESCAPE_OP_N.OPNUM: ESCAPE_OP_N,
+    ESCAPE_OP_R.OPNUM: ESCAPE_OP_R
+}
+
 class FORCE_SPILL(UnaryOp, PlainResOp):
 
-    OPNUM = -124
+    OPNUM = -127
     is_source_op = True
 
     def getopnum(self):
@@ -224,8 +245,14 @@
         try:
             opnum = getattr(rop, opname.upper())
         except AttributeError:
-            if opname == 'escape':
-                opnum = ESCAPE_OP.OPNUM
+            if opname == 'escape_i':
+                opnum = ESCAPE_OP_I.OPNUM
+            elif opname == 'escape_f':
+                opnum = ESCAPE_OP_F.OPNUM
+            elif opname == 'escape_n':
+                opnum = ESCAPE_OP_N.OPNUM
+            elif opname == 'escape_r':
+                opnum = ESCAPE_OP_R.OPNUM
             elif opname == 'force_spill':
                 opnum = FORCE_SPILL.OPNUM
             else:
@@ -268,8 +295,8 @@
         return opnum, args, descr, fail_args
 
     def create_op(self, opnum, args, descr):
-        if opnum == ESCAPE_OP.OPNUM:
-            op = ESCAPE_OP()
+        if opnum in ALL_ESCAPE_OPS:
+            op = ALL_ESCAPE_OPS[opnum]()
             op.initarglist(args)
             assert descr is None
             return op


More information about the pypy-commit mailing list