[pypy-commit] pypy vecopt: removed primitive type mixin
plan_rich
noreply at buildbot.pypy.org
Tue Jun 2 14:45:47 CEST 2015
Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r77759:20d16b623806
Date: 2015-06-02 14:43 +0200
http://bitbucket.org/pypy/pypy/changeset/20d16b623806/
Log: removed primitive type mixin added two schedule tests for
constant/variable expansion, need to move the instructions before
the label
diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -519,38 +519,7 @@
# ____________________________________________________________
-class PrimitiveTypeMixin(object):
- _mixin_ = True
-
- def gettype(self):
- raise NotImplementedError
- def getsize(self):
- raise NotImplementedError
- def getsigned(self):
- raise NotImplementedError
-
- def matches_type(self, other):
- assert isinstance(other, PrimitiveTypeMixin)
- return self.gettype() == other.gettype()
-
- def matches_size(self, other):
- assert isinstance(other, PrimitiveTypeMixin)
- return self.getsize() == other.getsize()
-
- def matches_sign(self, other):
- assert isinstance(other, PrimitiveTypeMixin)
- return self.getsigend() == other.signed()
-
- def matches(self, other):
- if isinstance(other, PrimitiveTypeMixin):
- return self.matches_type(other) and \
- self.matches_size(other) and \
- self.matches_sign(other)
- return False
-
-
-
-class BoxVector(Box, PrimitiveTypeMixin):
+class BoxVector(Box):
type = VECTOR
_attrs_ = ('item_type','item_count','item_size','item_signed')
_extended_display = False
diff --git a/rpython/jit/metainterp/optimizeopt/dependency.py b/rpython/jit/metainterp/optimizeopt/dependency.py
--- a/rpython/jit/metainterp/optimizeopt/dependency.py
+++ b/rpython/jit/metainterp/optimizeopt/dependency.py
@@ -602,7 +602,7 @@
while i >= 0:
node = self.nodes[i]
op = node.getoperation()
- if node.is_ovf():
+ if op.is_ovf():
break
i -= 1
else:
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
@@ -93,3 +93,34 @@
v3[f64#2] = vec_cast_int_to_float(v2[i32#2])
""", False)
self.assert_equal(loop2, loop3)
+
+ def test_scalar_pack(self):
+ loop1 = self.parse("""
+ i10 = int_add(i0, 73)
+ i11 = int_add(i1, 73)
+ """)
+ pack1 = self.pack(loop1, 0, 2)
+ loop2 = self.schedule(loop1, [pack1])
+ loop3 = self.parse("""
+ v1[i64#2] = vec_box(2)
+ v2[i64#2] = vec_int_pack(v1[i64#2], i0, 0, 1)
+ v3[i64#2] = vec_int_pack(v2[i64#2], i1, 1, 1)
+ v4[i64#2] = vec_int_expand(73)
+ v5[i64#2] = vec_int_add(v3[i64#2], v4[i64#2])
+ """, False)
+ self.assert_equal(loop2, loop3)
+
+ loop1 = self.parse("""
+ f10 = float_add(f0, 73.0)
+ f11 = float_add(f1, 73.0)
+ """)
+ pack1 = self.pack(loop1, 0, 2)
+ loop2 = self.schedule(loop1, [pack1])
+ loop3 = self.parse("""
+ v1[f64#2] = vec_box(2)
+ v2[f64#2] = vec_float_pack(v1[f64#2], f0, 0, 1)
+ v3[f64#2] = vec_float_pack(v2[f64#2], f1, 1, 1)
+ v4[f64#2] = vec_float_expand(73.0)
+ v5[f64#2] = vec_float_add(v3[f64#2], v4[f64#2])
+ """, False)
+ self.assert_equal(loop2, loop3)
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
@@ -5,7 +5,7 @@
from rpython.jit.metainterp.optimizeopt.unroll import optimize_unroll
from rpython.jit.metainterp.compile import ResumeAtLoopHeaderDescr, invent_fail_descr_for_op
from rpython.jit.metainterp.history import (ConstInt, VECTOR, FLOAT, INT,
- BoxVector, TargetToken, JitCellToken, Box, PrimitiveTypeMixin)
+ BoxVector, BoxFloat, BoxInt, ConstFloat, TargetToken, JitCellToken, Box)
from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer, Optimization
from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
from rpython.jit.metainterp.optimizeopt.dependency import (DependencyGraph,
@@ -593,7 +593,7 @@
assert isinstance(key2, IndexVar)
return key1.compare(key2)
#
- raise RuntimeError("cannot compare: " + str(key1) + " <=> " + str(key2))
+ raise AssertionError("cannot compare: " + str(key1) + " <=> " + str(key2))
def emit_varops(self, opt, var, old_arg):
if isinstance(var, IndexVar):
@@ -630,7 +630,7 @@
return op
i -= 1
- raise RuntimeError("guard_true/false first arg not defined")
+ raise AssertionError("guard_true/false first arg not defined")
def _get_key(self, cmp_op):
if cmp_op and rop.INT_LT <= cmp_op.getopnum() <= rop.INT_GE:
@@ -772,7 +772,7 @@
return 1
-class PackType(PrimitiveTypeMixin):
+class PackType(object):
UNKNOWN_TYPE = '-'
def __init__(self, type, size, signed, count=-1, scalar_cost=1, vector_cost=1):
@@ -845,11 +845,18 @@
return self.input_type.getsize()
def determine_input_type(self, op):
+ arg = op.getarg(0)
_, vbox = self.sched_data.getvector_of_box(op.getarg(0))
if vbox:
return PackType.of(vbox)
else:
- raise RuntimeError("fatal: box %s is not in a vector box" % (op.getarg(0),))
+ vec_reg_size = self.sched_data.vec_reg_size
+ if isinstance(arg, ConstInt) or isinstance(arg, BoxInt):
+ return PackType(INT, 8, True, 2)
+ elif isinstance(arg, ConstFloat) or isinstance(arg, BoxFloat):
+ return PackType(FLOAT, 8, True, 2)
+ else:
+ raise NotImplementedError("arg %s not supported" % (arg,))
def determine_output_type(self, op):
return self.determine_input_type(op)
@@ -1010,7 +1017,8 @@
op = ResOperation(opnum, [tgt_box, src_box, ConstInt(i),
ConstInt(src_box.item_count)], new_box)
self.preamble_ops.append(op)
- self._check_vec_pack(op)
+ if not we_are_translated():
+ self._check_vec_pack(op)
i += src_box.item_count
# overwrite the new positions, arguments now live in new_box
@@ -1041,10 +1049,11 @@
assert index.value + count.value <= result.item_count
assert result.item_count > arg0.item_count
- def expand_box_to_vector_box(self, vbox, ops, arg, argidx):
+ def expand_box_to_vector_box(self, vbox, nodes, arg, argidx):
all_same_box = True
- for i, op in enumerate(ops):
- if arg is not op.getoperation().getarg(argidx):
+ for i, node in enumerate(nodes):
+ op = node.getoperation()
+ if not arg.same_box(op.getarg(argidx)):
all_same_box = False
break
i += 1
@@ -1060,16 +1069,17 @@
expand_op = ResOperation(expand_opnum, [arg], vbox)
self.preamble_ops.append(expand_op)
else:
- resop = ResOperation(rop.VEC_BOX, [ConstInt(len(ops))], vbox)
+ resop = ResOperation(rop.VEC_BOX, [ConstInt(len(nodes))], vbox)
self.preamble_ops.append(resop)
opnum = rop.VEC_FLOAT_PACK
if arg.type == INT:
opnum = rop.VEC_INT_PACK
- for i,op in enumerate(ops):
- arg = op.getoperation().getarg(argidx)
+ for i,node in enumerate(nodes):
+ op = node.getoperation()
+ arg = op.getarg(argidx)
new_box = vbox.clonebox()
resop = ResOperation(opnum,
- [vbox,arg,ConstInt(i),ConstInt(0)], new_box)
+ [vbox,arg,ConstInt(i),ConstInt(1)], new_box)
vbox = new_box
self.preamble_ops.append(resop)
return vbox
More information about the pypy-commit
mailing list