[pypy-svn] r74470 - in pypy/trunk/pypy/jit: backend/x86 metainterp

arigo at codespeak.net arigo at codespeak.net
Mon May 10 16:45:38 CEST 2010


Author: arigo
Date: Mon May 10 16:45:36 2010
New Revision: 74470

Modified:
   pypy/trunk/pypy/jit/backend/x86/assembler.py
   pypy/trunk/pypy/jit/backend/x86/regalloc.py
   pypy/trunk/pypy/jit/metainterp/optimizeopt.py
Log:
issue529 testing

Change the backend to only accept int_xxx_ovf operations immediately
followed by guard_(no)_overflow.  A corresponding fix in the front-end
to keep these two operations together.


Modified: pypy/trunk/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/assembler.py	(original)
+++ pypy/trunk/pypy/jit/backend/x86/assembler.py	Mon May 10 16:45:36 2010
@@ -629,10 +629,6 @@
     genop_float_mul = _binaryop('MULSD', True)
     genop_float_truediv = _binaryop('DIVSD')
 
-    genop_int_mul_ovf = genop_int_mul
-    genop_int_sub_ovf = genop_int_sub
-    genop_int_add_ovf = genop_int_add
-
     genop_int_lt = _cmpop("L", "G")
     genop_int_le = _cmpop("LE", "GE")
     genop_int_eq = _cmpop("E", "E")
@@ -969,13 +965,27 @@
         self.mc.MOV(heap(self.cpu.pos_exc_value()), imm(0))
         return addr
 
-    def genop_guard_guard_no_overflow(self, ign_1, guard_op, addr,
-                                      locs, resloc):
-        return self.implement_guard(addr, self.mc.JO)
-
-    def genop_guard_guard_overflow(self, ign_1, guard_op, addr,
-                                   locs, resloc):
-        return self.implement_guard(addr, self.mc.JNO)
+    def _gen_guard_overflow(self, guard_op, addr):
+        guard_opnum = guard_op.opnum
+        if guard_opnum == rop.GUARD_NO_OVERFLOW:
+            return self.implement_guard(addr, self.mc.JO)
+        elif guard_opnum == rop.GUARD_OVERFLOW:
+            return self.implement_guard(addr, self.mc.JNO)
+        else:
+            print "int_xxx_ovf followed by", guard_op.getopname()
+            raise AssertionError
+
+    def genop_guard_int_add_ovf(self, op, guard_op, addr, arglocs, result_loc):
+        self.genop_int_add(op, arglocs, result_loc)
+        return self._gen_guard_overflow(guard_op, addr)
+
+    def genop_guard_int_sub_ovf(self, op, guard_op, addr, arglocs, result_loc):
+        self.genop_int_sub(op, arglocs, result_loc)
+        return self._gen_guard_overflow(guard_op, addr)
+
+    def genop_guard_int_mul_ovf(self, op, guard_op, addr, arglocs, result_loc):
+        self.genop_int_mul(op, arglocs, result_loc)
+        return self._gen_guard_overflow(guard_op, addr)
 
     def genop_guard_guard_false(self, ign_1, guard_op, addr, locs, ign_2):
         loc = locs[0]

Modified: pypy/trunk/pypy/jit/backend/x86/regalloc.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/regalloc.py	(original)
+++ pypy/trunk/pypy/jit/backend/x86/regalloc.py	Mon May 10 16:45:36 2010
@@ -322,6 +322,12 @@
             assert operations[i + 1].opnum == rop.GUARD_NOT_FORCED
             return True
         if not op.is_comparison():
+            if op.is_ovf():
+                if (operations[i + 1].opnum != rop.GUARD_NO_OVERFLOW and
+                    operations[i + 1].opnum != rop.GUARD_OVERFLOW):
+                    print "int_xxx_ovf not followed by guard_(no)_overflow"
+                    raise AssertionError
+                return True
             return False
         if (operations[i + 1].opnum != rop.GUARD_TRUE and
             operations[i + 1].opnum != rop.GUARD_FALSE):
@@ -467,9 +473,13 @@
     consider_int_or  = _consider_binop
     consider_int_xor = _consider_binop
 
-    consider_int_mul_ovf = _consider_binop
-    consider_int_sub_ovf = _consider_binop
-    consider_int_add_ovf = _consider_binop
+    def _consider_binop_with_guard(self, op, guard_op):
+        loc, argloc = self._consider_binop_part(op)
+        self.perform_with_guard(op, guard_op, [loc, argloc], loc)
+
+    consider_int_mul_ovf = _consider_binop_with_guard
+    consider_int_sub_ovf = _consider_binop_with_guard
+    consider_int_add_ovf = _consider_binop_with_guard
 
     def consider_int_neg(self, op):
         res = self.rm.force_result_in_reg(op.result, op.args[0])
@@ -1000,6 +1010,7 @@
         name = name[len('consider_'):]
         num = getattr(rop, name.upper())
         if (ResOperation(num, [], None).is_comparison()
+            or ResOperation(num, [], None).is_ovf()
             or num == rop.CALL_MAY_FORCE or num == rop.CALL_ASSEMBLER):
             oplist_with_guard[num] = value
             oplist[num] = add_none_argument(value)

Modified: pypy/trunk/pypy/jit/metainterp/optimizeopt.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/optimizeopt.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/optimizeopt.py	Mon May 10 16:45:36 2010
@@ -1111,7 +1111,10 @@
             prevop = newoperations[-2]
             # - is_comparison() for cases like "int_eq/setfield_gc/guard_true"
             # - CALL_MAY_FORCE: "call_may_force/setfield_gc/guard_not_forced"
-            if ((prevop.is_comparison() or prevop.opnum == rop.CALL_MAY_FORCE)
+            # - is_ovf(): "int_add_ovf/setfield_gc/guard_no_overflow"
+            opnum = prevop.opnum
+            if ((prevop.is_comparison() or opnum == rop.CALL_MAY_FORCE
+                 or prevop.is_ovf())
                 and prevop.result not in lastop.args):
                 newoperations[-2] = lastop
                 newoperations[-1] = prevop



More information about the Pypy-commit mailing list