[pypy-commit] pypy fast-slowpath: This seems to work
fijal
noreply at buildbot.pypy.org
Fri Jul 19 00:03:11 CEST 2013
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: fast-slowpath
Changeset: r65471:8d11a494f1a9
Date: 2013-07-19 00:02 +0200
http://bitbucket.org/pypy/pypy/changeset/8d11a494f1a9/
Log: This seems to work
diff --git a/rpython/jit/backend/llsupport/rewrite.py b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -126,27 +126,6 @@
else:
self.gen_malloc_fixedsize(size, descr.tid, op.result)
- def handle_list_resize_ge(self, op):
- """ what we want to do is to check the length and than add a conditional
- call to really resize
- """
- extra_info = op.getdescr().get_extra_info()
- itemsdescr = extra_info.extra_descrs[0]
- arraydescr = extra_info.extra_descrs[1]
- func = op.getarg(0)
- lst = op.getarg(1)
- newsizebox = op.getarg(2)
- arrbox = BoxPtr()
- arrlenbox = BoxInt()
- cond_box = BoxInt()
- op0 = ResOperation(rop.GETFIELD_GC, [lst], arrbox, descr=itemsdescr)
- op1 = ResOperation(rop.ARRAYLEN_GC, [arrbox], arrlenbox,
- descr=arraydescr)
- op2 = ResOperation(rop.INT_GE, [arrlenbox, newsizebox], cond_box)
- op3 = ResOperation(rop.COND_CALL, [cond_box, func, lst, newsizebox],
- None, descr=op.getdescr())
- self.newops += [op0, op1, op2, op3]
-
def handle_new_array(self, arraydescr, op, kind=FLAG_ARRAY):
v_length = op.getarg(0)
total_size = -1
@@ -245,6 +224,30 @@
self.newops.append(ResOperation(rop.CALL_ASSEMBLER, args,
op.result, op.getdescr()))
+ def handle_list_resize_ge(self, op):
+ """ what we want to do is to check the length and than add a conditional
+ call to really resize
+ """
+ extra_info = op.getdescr().get_extra_info()
+ lendescr = extra_info.extra_descrs[0]
+ itemsdescr = extra_info.extra_descrs[1]
+ arraydescr = extra_info.extra_descrs[2]
+ func = op.getarg(0)
+ lst = op.getarg(1)
+ newsizebox = op.getarg(2)
+ arrbox = BoxPtr()
+ arrlenbox = BoxInt()
+ cond_box = BoxInt()
+ op0 = ResOperation(rop.GETFIELD_GC, [lst], arrbox, descr=itemsdescr)
+ op1 = ResOperation(rop.ARRAYLEN_GC, [arrbox], arrlenbox,
+ descr=arraydescr)
+ op2 = ResOperation(rop.INT_LT, [arrlenbox, newsizebox], cond_box)
+ op3 = ResOperation(rop.COND_CALL, [cond_box, func, lst, newsizebox],
+ None, descr=op.getdescr())
+ op4 = ResOperation(rop.SETFIELD_GC, [lst, newsizebox], None,
+ descr=lendescr)
+ self.newops += [op0, op1, op2, op3, op4]
+
# ----------
def emitting_an_operation_that_can_collect(self):
diff --git a/rpython/jit/backend/llsupport/test/test_rewrite.py b/rpython/jit/backend/llsupport/test/test_rewrite.py
--- a/rpython/jit/backend/llsupport/test/test_rewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_rewrite.py
@@ -92,12 +92,13 @@
ARRAY = lltype.GcArray(lltype.Signed)
LIST = lltype.GcStruct('LIST', ('length', lltype.Signed),
('items', lltype.Ptr(ARRAY)))
+ lendescr = get_field_descr(self.gc_ll_descr, LIST, 'length')
itemsdescr = get_field_descr(self.gc_ll_descr, LIST, 'items')
arraydescr = get_array_descr(self.gc_ll_descr, ARRAY)
extrainfo = EffectInfo(None, None, None, None,
extraeffect=EffectInfo.EF_RANDOM_EFFECTS,
oopspecindex=EffectInfo.OS_LIST_RESIZE_GE,
- extra_descrs=[itemsdescr, arraydescr])
+ extra_descrs=[lendescr, itemsdescr, arraydescr])
list_resize_descr = get_call_descr(self.gc_ll_descr,
[lltype.Ptr(LIST), lltype.Signed],
lltype.Void, extrainfo)
@@ -798,6 +799,7 @@
[p0, i0]
p1 = getfield_gc(p0, descr=itemsdescr)
i1 = arraylen_gc(p1, descr=arraydescr)
- i2 = int_ge(i1, i0)
+ i2 = int_lt(i1, i0)
cond_call(i2, ConstClass(list_resize_ge), p0, i0, descr=list_resize_descr)
+ setfield_gc(p0, i0, descr=lendescr)
""")
diff --git a/rpython/jit/codewriter/effectinfo.py b/rpython/jit/codewriter/effectinfo.py
--- a/rpython/jit/codewriter/effectinfo.py
+++ b/rpython/jit/codewriter/effectinfo.py
@@ -272,8 +272,10 @@
funcobj = op.args[0].value._obj
if funcobj.random_effects_on_gcobjs:
return True
- except (AttributeError, lltype.DelayedPointer):
+ except lltype.DelayedPointer:
return True # better safe than sorry
+ except AttributeError:
+ return False
return super(RandomEffectsAnalyzer, self).analyze_external_call(
op, seen)
diff --git a/rpython/jit/codewriter/jtransform.py b/rpython/jit/codewriter/jtransform.py
--- a/rpython/jit/codewriter/jtransform.py
+++ b/rpython/jit/codewriter/jtransform.py
@@ -1622,9 +1622,11 @@
index = EffectInfo.OS_LIST_RESIZE_GE
LIST = args[0].concretetype.TO
itemsdescr = self.cpu.fielddescrof(LIST, 'items')
+ lendescr = self.cpu.fielddescrof(LIST, 'length')
arraydescr = self.cpu.arraydescrof(LIST.items.TO)
return self.handle_residual_call(op, oopspecindex=index,
- extradescrs=[itemsdescr, arraydescr])
+ extradescrs=[lendescr, itemsdescr,
+ arraydescr])
# ----------
# Strings and Unicodes.
More information about the pypy-commit
mailing list