Author: Carl Friedrich Bolz-Tereick <cfb...@gmx.de>
Branch: regalloc-playground
Changeset: r92328:d2f37627db2e
Date: 2017-09-05 18:33 +0200
http://bitbucket.org/pypy/pypy/changeset/d2f37627db2e/

Log:    extract a series of int ops from a real trace (and implement
        int_neg)

diff --git a/rpython/jit/backend/x86/regalloc.py 
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -1000,6 +1000,7 @@
     consider_cond_call_value_r = consider_cond_call
 
     def consider_call_malloc_nursery(self, op):
+        # YYY what's the reason for using a fixed register for the result?
         size_box = op.getarg(0)
         assert isinstance(size_box, ConstInt)
         size = size_box.getint()
diff --git a/rpython/jit/backend/x86/reghint.py 
b/rpython/jit/backend/x86/reghint.py
--- a/rpython/jit/backend/x86/reghint.py
+++ b/rpython/jit/backend/x86/reghint.py
@@ -32,18 +32,27 @@
         # no hint by default
         pass
 
+
+    def consider_int_neg(self, op, position):
+        self.longevity.try_use_same_register(op.getarg(0), op)
+    consider_int_invert = consider_int_neg
+
     def _consider_binop_part(self, op, position, symm=False):
         x = op.getarg(0)
         y = op.getarg(1)
 
         # For symmetrical operations, if y won't be used after the current
         # operation finishes, but x will be, then swap the role of 'x' and 'y'
-        if (symm and isinstance(x, ConstInt) or (
-                not isinstance(y, ConstInt) and
-                self.longevity[x].last_usage > position and
-                self.longevity[y].last_usage == position)):
-            x, y = y, x
-        self.longevity.try_use_same_register(x, op)
+        if symm:
+            if isinstance(x, Const):
+                x, y = y, x
+            elif (not isinstance(y, Const) and
+                    self.longevity[x].last_usage > position and
+                    self.longevity[y].last_usage == position):
+                x, y = y, x
+
+        if not isinstance(x, Const):
+            self.longevity.try_use_same_register(x, op)
 
     def _consider_binop(self, op, position):
         self._consider_binop_part(op, position)
@@ -89,8 +98,8 @@
         self.longevity.fixed_register(position, ecx, op)
         self.longevity.fixed_register(position, edx)
 
-    #consider_call_malloc_nursery_varsize = consider_call_malloc_nursery
-    #consider_call_malloc_nursery_varsize_frame = consider_call_malloc_nursery
+    consider_call_malloc_nursery_varsize = consider_call_malloc_nursery
+    consider_call_malloc_nursery_varsize_frame = consider_call_malloc_nursery
 
 
     def _call(self, op, position, args, save_all_regs=False):
diff --git a/rpython/jit/backend/x86/test/test_regalloc.py 
b/rpython/jit/backend/x86/test/test_regalloc.py
--- a/rpython/jit/backend/x86/test/test_regalloc.py
+++ b/rpython/jit/backend/x86/test/test_regalloc.py
@@ -226,3 +226,36 @@
         # 2 moves, because the call_malloc_nursery hints prevent using ecx and
         # edx for any of the integer results
         assert len(self.filter_log_moves()) == 2
+
+    def test_flowcontext(self):
+        # real index manipulation for a slicing operation done when translating
+        # on top of pypy
+        ops = """
+        [i1, i2]
+        i3 = int_and(i1, 255)
+        i4 = int_rshift(i1, 8)
+        i5 = int_and(i4, 255)
+        i6 = int_lt(0, i5)
+        guard_false(i6) [i1]
+        i7 = int_eq(i3, 0)
+        guard_false(i7) [i1]
+        i8 = int_neg(i3)
+        i9 = int_lt(i8, 0)
+        guard_true(i9) [i1]
+        i10 = int_lt(i2, 0)
+        guard_false(i10) [i1]
+        i11 = int_add(i8, i2)
+        i12 = int_lt(i11, 0)
+        guard_false(i12) [i1]
+        i13 = int_gt(i11, i2)
+        guard_false(i13) [i1]
+        i14 = int_sub(i2, i11)
+        i15 = int_is_zero(i14)
+        guard_false(i15) [i1]
+        # this simulates the arraycopy call
+        i16 = call_i(ConstClass(f2ptr), i11, i14, descr=f2_calldescr)
+        finish(i16)
+        """
+        self.interpret(ops, [0], run=False)
+        # 4 moves, three for args, one for result
+        assert len(self.filter_log_moves()) == 4
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to