Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r61052:d1e8b34335c6
Date: 2013-02-10 23:59 +0200
http://bitbucket.org/pypy/pypy/changeset/d1e8b34335c6/

Log:    Make sure we allocate floats at even places (and the comments are
        true)

diff --git a/rpython/jit/backend/llsupport/regalloc.py 
b/rpython/jit/backend/llsupport/regalloc.py
--- a/rpython/jit/backend/llsupport/regalloc.py
+++ b/rpython/jit/backend/llsupport/regalloc.py
@@ -1,5 +1,5 @@
 import os
-from rpython.jit.metainterp.history import Const, Box, REF, INT
+from rpython.jit.metainterp.history import Const, Box, REF
 from rpython.rlib.objectmodel import we_are_translated, specialize
 from rpython.jit.metainterp.resoperation import rop
 
@@ -77,7 +77,7 @@
         return self.fm.frame_pos(node.val, tp)
 
     def _candidate(self, node):
-        return node.val + 1 == node.next.val
+        return (node.val & 1 == 0) and (node.val + 1 == node.next.val)
         
     def _pop_two(self, tp):
         node = self.master_node
@@ -165,8 +165,15 @@
         if newloc is None:
             #
             index = self.get_frame_depth()
-            newloc = self.frame_pos(index, box.type)
-            self.current_frame_depth += size
+            if index & 1 and size == 2:
+                # we can't allocate it at odd position
+                self.freelist._append(index)
+                newloc = self.frame_pos(index + 1, box.type)
+                self.current_frame_depth += 3
+                index += 1 # for test
+            else:
+                newloc = self.frame_pos(index, box.type)
+                self.current_frame_depth += size
             #
             if not we_are_translated():    # extra testing
                 testindex = self.get_loc_index(newloc)
diff --git a/rpython/jit/backend/llsupport/test/test_regalloc.py 
b/rpython/jit/backend/llsupport/test/test_regalloc.py
--- a/rpython/jit/backend/llsupport/test/test_regalloc.py
+++ b/rpython/jit/backend/llsupport/test/test_regalloc.py
@@ -477,8 +477,11 @@
         assert l.pop(1, 0).pos == 2
         assert l.pop(1, 0) is None
         l.append(2, Loc(1, 2, 0))
+        # this will not work because the result will be odd
+        assert l.pop(2, 13) is None
+        l.append(1, Loc(3, 1, 0))
         item = l.pop(2, 13)
-        assert item.pos == 1
+        assert item.pos == 2
         assert item.tp == 13
         assert item.size == 2
 
@@ -553,13 +556,14 @@
         #
         f0 = BoxFloat()
         locf0 = fm.loc(f0)
-        assert fm.get_loc_index(locf0) == 3
-        assert fm.get_frame_depth() == 5
+        # can't be odd
+        assert fm.get_loc_index(locf0) == 4
+        assert fm.get_frame_depth() == 6
         #
         f1 = BoxFloat()
         locf1 = fm.loc(f1)
-        assert fm.get_loc_index(locf1) == 5
-        assert fm.get_frame_depth() == 7
+        assert fm.get_loc_index(locf1) == 6
+        assert fm.get_frame_depth() == 8
         fm.mark_as_free(b1)
         assert fm.freelist
         b2 = BoxInt()
@@ -570,11 +574,11 @@
         p0 = BoxPtr()
         ploc = fm.loc(p0)
         assert fm.get_loc_index(ploc) == 0
-        assert fm.get_frame_depth() == 7
+        assert fm.get_frame_depth() == 8
         assert ploc != loc1
         p1 = BoxPtr()
         p1loc = fm.loc(p1)
-        assert fm.get_loc_index(p1loc) == 7
+        assert fm.get_loc_index(p1loc) == 3
         assert fm.get_frame_depth() == 8
         fm.mark_as_free(p0)
         p2 = BoxPtr()
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to