Author: Richard Plangger <[email protected]>
Branch: vecopt
Changeset: r78317:369284ff1423
Date: 2015-06-25 12:21 +0200
http://bitbucket.org/pypy/pypy/changeset/369284ff1423/
Log: passing all scheduling tests again
diff --git a/rpython/jit/metainterp/optimizeopt/schedule.py
b/rpython/jit/metainterp/optimizeopt/schedule.py
--- a/rpython/jit/metainterp/optimizeopt/schedule.py
+++ b/rpython/jit/metainterp/optimizeopt/schedule.py
@@ -250,16 +250,12 @@
# prohibit the packing of signext calls that
# cast to int16/int8.
_, outsize = op0.cast_to()
- self._prevent_signext(outsize, insize)
+ self.sched_data._prevent_signext(outsize, insize)
if op0.getopnum() == rop.INT_MUL:
if insize == 8 or insize == 1:
# see assembler for comment why
raise NotAProfitableLoop
- def _prevent_signext(self, outsize, insize):
- if outsize < 4 and insize != outsize:
- raise NotAProfitableLoop
-
def as_vector_operation(self, pack, sched_data, oplist):
self.sched_data = sched_data
self.preamble_ops = oplist
@@ -394,7 +390,7 @@
def extend_int(self, vbox, newtype):
vbox_cloned = newtype.new_vector_box(vbox.item_count)
- self._prevent_signext(newtype.getsize(), vbox.getsize())
+ self.sched_data._prevent_signext(newtype.getsize(), vbox.getsize())
op = ResOperation(rop.VEC_INT_SIGNEXT,
[vbox, ConstInt(newtype.getsize())],
vbox_cloned)
@@ -676,6 +672,10 @@
self.expanded_map = {}
self.costmodel = costmodel
+ def _prevent_signext(self, outsize, insize):
+ if outsize < 4 and insize != outsize:
+ raise NotAProfitableLoop
+
def as_vector_operation(self, pack, preproc_renamer):
assert pack.opcount() > 1
# properties that hold for the pack are:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_schedule.py
b/rpython/jit/metainterp/optimizeopt/test/test_schedule.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_schedule.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_schedule.py
@@ -61,7 +61,7 @@
def pack(self, loop, l, r):
return Pack([Node(op,1+l+i) for i,op in
enumerate(loop.operations[1+l:1+r])], None, None)
- def schedule(self, loop_orig, packs, vec_reg_size=16,
prepend_invariant=False, getvboxfunc=None):
+ def schedule(self, loop_orig, packs, vec_reg_size=16,
prepend_invariant=False, overwrite_funcs=None):
loop = get_model(False).ExtendedTreeLoop("loop")
loop.original_jitcell_token = loop_orig.original_jitcell_token
loop.inputargs = loop_orig.inputargs
@@ -69,8 +69,8 @@
ops = []
cm = X86_CostModel(0, vec_reg_size)
vsd = VecScheduleData(vec_reg_size, cm)
- if getvboxfunc is not None:
- vsd.getvector_of_box = getvboxfunc
+ for name, overwrite in (overwrite_funcs or {}).items():
+ setattr(vsd, name, overwrite)
renamer = Renamer()
for pack in packs:
if pack.opcount() == 1:
@@ -191,7 +191,10 @@
var = self.find_input_arg('v10', loop1)
def i1inv103204(v):
return 0, var
- loop2 = self.schedule(loop1, [pack1], prepend_invariant=True,
getvboxfunc=i1inv103204)
+ loop2 = self.schedule(loop1, [pack1], prepend_invariant=True,
+ overwrite_funcs = {
+ 'getvector_of_box': i1inv103204,
+ })
loop3 = self.parse("""
v11[i32|2] = vec_int_signext(v10[i64|2], 4)
""", False, additional_args=['v10[i64|2]'])
@@ -239,7 +242,12 @@
pack2 = self.pack(loop1, 8, 16)
pack3 = self.pack(loop1, 16, 24)
pack4 = self.pack(loop1, 24, 32)
- loop2 = self.schedule(loop1, [pack1,pack2,pack3,pack4])
+ def void(b,c):
+ pass
+ loop2 = self.schedule(loop1, [pack1,pack2,pack3,pack4],
+ overwrite_funcs={
+ '_prevent_signext': void
+ })
loop3 = self.parse("""
v10[f64|2] = vec_raw_load(p0, i1, 2, descr=double)
v11[f64|2] = vec_raw_load(p0, i3, 2, descr=double)
diff --git a/rpython/jit/metainterp/optimizeopt/vectorize.py
b/rpython/jit/metainterp/optimizeopt/vectorize.py
--- a/rpython/jit/metainterp/optimizeopt/vectorize.py
+++ b/rpython/jit/metainterp/optimizeopt/vectorize.py
@@ -76,10 +76,11 @@
ns))
debug_stop("xxx-clock")
except NotAVectorizeableLoop:
+ debug_stop("vec-opt-loop")
# vectorization is not possible
loop.operations = orig_ops
+ except NotAProfitableLoop:
debug_stop("vec-opt-loop")
- except NotAProfitableLoop:
# cost model says to skip this loop
loop.operations = orig_ops
except Exception as e:
diff --git a/rpython/jit/metainterp/resoperation.py
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -814,8 +814,8 @@
rop.CAST_FLOAT_TO_INT: rop.VEC_CAST_FLOAT_TO_INT,
# guard
- #rop.GUARD_TRUE: rop.GUARD_TRUE,
- #rop.GUARD_FALSE: rop.GUARD_FALSE,
+ rop.GUARD_TRUE: rop.GUARD_TRUE,
+ rop.GUARD_FALSE: rop.GUARD_FALSE,
}
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit