[pypy-svn] r62908 - in pypy/branch/pyjitpl5/pypy/jit/backend/x86: . test
fijal at codespeak.net
fijal at codespeak.net
Thu Mar 12 21:38:33 CET 2009
Author: fijal
Date: Thu Mar 12 21:38:31 2009
New Revision: 62908
Modified:
pypy/branch/pyjitpl5/pypy/jit/backend/x86/regalloc.py
pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_regalloc.py
Log:
a partial fix. test segfault so far
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/regalloc.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/regalloc.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/regalloc.py Thu Mar 12 21:38:31 2009
@@ -950,6 +950,8 @@
ops = []
laterops = []
middle_ops = []
+ reloaded = []
+ middle_busy_regs = []
for i in range(len(op.args)):
arg = op.args[i]
mp = op.jump_target
@@ -961,7 +963,7 @@
if not isinstance(res, REG):
ops.append(Store(arg, self.loc(arg), self.stack_bindings[arg]))
elif res is self.reg_bindings[arg]:
- pass
+ middle_busy_regs.append(res)
else:
# register, but wrong
# we're going to need it (otherwise it'll be dead), so
@@ -985,10 +987,32 @@
if isinstance(res, REG):
laterops.append(Load(arg, self.loc(arg), res))
else:
- if not we_are_translated():
- assert repr(res) == repr(self.loc(arg))
+ if self.loc(arg).position != res.position:
+ reloaded.append((arg, self.loc(arg), res))
elif isinstance(arg, Const):
laterops.append(Load(arg, self.loc(arg), res))
+ if reloaded:
+ self.eventually_free_vars(op.args)
+ middleops = []
+ # XXX performance
+ free_reg = None
+ last_middle_op = None
+ for reg in REGS:
+ if reg not in middle_busy_regs:
+ free_reg = reg
+ break
+ if free_reg is None:
+ # a very rare case
+ v = self.reg_bindings.keys()[0]
+ free_reg = self.reg_bindings[v]
+ ops.append(Store(v, self.loc(v), self.stack_loc(v)))
+ last_middle_op = Load(v, self.stack_loc(v), self.loc(v))
+ for v, from_l, to_l in reloaded:
+ middleops.append(Load(v, from_l, free_reg))
+ middleops.append(Store(v, free_reg, to_l))
+ if last_middle_op is not None:
+ middleops.append(last_middle_op)
+ return ops + middleops + laterops + [PerformDiscard(op, [])]
self.eventually_free_vars(op.args)
return ops + laterops + [PerformDiscard(op, [])]
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_regalloc.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_regalloc.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_regalloc.py Thu Mar 12 21:38:31 2009
@@ -183,6 +183,8 @@
cpu = CPU(rtyper=None, stats=FakeStats())
cpu.set_meta_interp(meta_interp)
TP = lltype.GcStruct('x', ('y', lltype.Ptr(lltype.GcStruct('y'))))
+ cpu.assembler._ovf_error_vtable = llmemory.cast_ptr_to_adr(lltype.nullptr(TP))
+ cpu.assembler._ovf_error_inst = cpu.assembler._ovf_error_vtable
p0 = BoxPtr()
p1 = BoxPtr()
@@ -283,5 +285,5 @@
ops[-1].jump_target = ops[0]
cpu.compile_operations(ops)
- args = p0, p1, i2, i3, i4, i5, p6, p7, i8, i9, i10, i11, p12, p31
+ args = [p0, p1, i2, i3, i4, i5, p6, p7, i8, i9, i10, i11, p12, p13]
res = cpu.execute_operations_in_new_frame('foo', ops, args)
More information about the Pypy-commit
mailing list