[pypy-commit] pypy vecopt-merge: pushing forward test_zjit on llgraph
plan_rich
noreply at buildbot.pypy.org
Mon Sep 28 15:09:31 CEST 2015
Author: Richard Plangger <planrichi at gmail.com>
Branch: vecopt-merge
Changeset: r79881:8a8e13743c1e
Date: 2015-09-28 15:09 +0200
http://bitbucket.org/pypy/pypy/changeset/8a8e13743c1e/
Log: pushing forward test_zjit on llgraph
diff --git a/pypy/module/micronumpy/test/test_zjit.py b/pypy/module/micronumpy/test/test_zjit.py
--- a/pypy/module/micronumpy/test/test_zjit.py
+++ b/pypy/module/micronumpy/test/test_zjit.py
@@ -7,6 +7,7 @@
from rpython.jit.backend.x86.test.test_basic import Jit386Mixin
from rpython.jit.metainterp.warmspot import reset_jit, get_stats
from rpython.jit.metainterp.jitprof import Profiler
+from rpython.jit.metainterp import counter
from rpython.rlib.jit import Counters
from rpython.rlib.rarithmetic import intmask
from pypy.module.micronumpy import boxes
@@ -17,7 +18,13 @@
from rpython.jit.metainterp import pyjitpl
return pyjitpl._warmrunnerdesc.metainterp_sd.profiler
-class TestNumpyJit(Jit386Mixin):
+class TestNumPyLL(LLJitMixin):
+ llgraph = True
+
+class TestNumPyX86(Jit386Mixin):
+ llgraph = False
+
+class TestNumpyJit(LLJitMixin):
enable_opts = "intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll"
graph = None
interp = None
@@ -98,11 +105,11 @@
backendopt=True,
graph_and_interp_only=True,
ProfilerClass=Profiler,
- translate_support_code=True,
- translationoptions={'gc':'minimark',
- 'gcrootfinder': 'asmgcc',
- 'gcremovetypeptr': False
- },
+ #translate_support_code=True,
+ #translationoptions={'gc':'minimark',
+ # 'gcrootfinder': 'asmgcc',
+ # 'gcremovetypeptr': False
+ # },
vec=True)
self.__class__.interp = interp
self.__class__.graph = graph
@@ -119,6 +126,8 @@
self.compile_graph()
profiler = get_profiler()
profiler.start()
+ from rpython.jit.metainterp import pyjitpl
+ pyjitpl._warmrunnerdesc.jitcounter = counter.DeterministicJitCounter()
reset_jit()
i = self.code_mapping[name]
retval = self.interp.eval_graph(self.graph, [i])
@@ -162,7 +171,7 @@
def test_float32_add(self):
result = self.run("float32_add")
self.assert_float_equal(result, 15.0 + 15.0)
- self.check_vectorized(2, 2)
+ self.check_vectorized(1, 1)
def define_float_add():
return """
@@ -195,7 +204,7 @@
def test_float32_add_const(self):
result = self.run("float32_add_const")
self.assert_float_equal(result, 29.0 + 77.345)
- self.check_vectorized(2, 2)
+ self.check_vectorized(1, 1)
def define_float_add_const():
return """
@@ -237,7 +246,7 @@
def test_int_expand(self):
result = self.run("int_expand")
assert int(result) == 7+16+8+16
- self.check_vectorized(2, 2)
+ self.check_vectorized(1, 1)
def define_int32_expand():
return """
@@ -303,7 +312,7 @@
def test_int32_add_const(self):
result = self.run("int32_add_const")
assert int(result) == 7+1+8+1+11+2+12+2
- self.check_vectorized(2, 2)
+ self.check_vectorized(1, 1)
def define_float_mul_array():
return """
@@ -335,7 +344,7 @@
def test_int32_mul_array(self):
result = self.run("int32_mul_array")
assert int(result) == 7*7+8*8+11*11+12*12
- self.check_vectorized(2, 2)
+ self.check_vectorized(1, 1)
def define_float32_mul_array():
return """
@@ -363,7 +372,7 @@
def test_conversion(self):
result = self.run("conversion")
assert result == sum(range(30)) + sum(range(30))
- self.check_vectorized(4, 2) # only sum and astype(int) succeed
+ self.check_vectorized(2, 2) # only sum and astype(int) succeed
def define_sum():
return """
@@ -393,7 +402,7 @@
def test_sum_int(self):
result = self.run("sum_int")
assert result == sum(range(65))
- self.check_vectorized(2, 2) # 1 sum, 1 for type conversion
+ self.check_vectorized(1, 1)
def define_sum_multi():
return """
@@ -501,7 +510,7 @@
retval = self.interp.eval_graph(self.graph, [i])
# check that we got only one loop
assert len(get_stats().loops) == 1
- self.check_vectorized(3, 1)
+ self.check_vectorized(2, 1)
def define_prod():
return """
diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -839,7 +839,22 @@
return [int(x) ^ int(y) for x,y in zip(vx,vy)]
def bh_vec_cast_float_to_singlefloat(self, vx, count):
- return vx
+ from rpython.rlib.rarithmetic import r_singlefloat
+ return [longlong.singlefloat2int(r_singlefloat(longlong.getrealfloat(v)))
+ for v in vx]
+
+ def bh_vec_cast_singlefloat_to_float(self, vx, count):
+ return [longlong.getfloatstorage(float(longlong.int2singlefloat(v)))
+ for v in vx]
+
+ a = float(a)
+ return longlong.getfloatstorage(a)
+
+ def bh_vec_cast_float_to_int(self, vx, count):
+ return [int(x) for x in vx]
+
+ def bh_vec_cast_int_to_float(self, vx, count):
+ return [float(x) for x in vx]
def bh_vec_f(self, count):
return [0.0] * count
@@ -847,7 +862,8 @@
def bh_vec_i(self, count):
return [0] * count
- def _bh_vec_pack(self, tv, sv, index, count, _):
+ def _bh_vec_pack(self, tv, sv, index, count, newcount):
+ while len(tv) < newcount: tv.append(None)
if not isinstance(sv, list):
tv[index] = sv
return tv
@@ -858,7 +874,7 @@
bh_vec_pack_f = _bh_vec_pack
bh_vec_pack_i = _bh_vec_pack
- def _bh_vec_unpack(self, vx, index, count):
+ def _bh_vec_unpack(self, vx, index, count, newcount):
return vx[index:index+count]
bh_vec_unpack_f = _bh_vec_unpack
@@ -966,14 +982,15 @@
return hash(self)
def setenv(self, box, arg):
- if box.is_vector():
+ if box.is_vector() and box.count > 1:
if box.datatype == INT:
- _type = lltype.Signed
for i,a in enumerate(arg):
if isinstance(a, bool):
arg[i] = int(a)
+ assert all([lltype.typeOf(a) == lltype.Signed for a in arg])
elif box.datatype == FLOAT:
- _type = longlong.FLOATSTORAGE
+ assert all([lltype.typeOf(a) == longlong.FLOATSTORAGE or \
+ lltype.typeOf(a) == lltype.Signed for a in arg])
else:
raise AssertionError(box)
elif box.type == INT:
@@ -1429,10 +1446,20 @@
else:
new_args = args
if opname.startswith('vec_'):
+ # pre vector op
count = self.current_op.count
- assert count > 1
+ assert count >= 1
new_args = new_args + (count,)
- return getattr(self.cpu, 'bh_' + opname)(*new_args)
+ result = getattr(self.cpu, 'bh_' + opname)(*new_args)
+ if isinstance(result, list):
+ # post vector op
+ count = self.current_op.count
+ if len(result) > count:
+ assert count > 0
+ result = result[:count]
+ if count == 1:
+ result = result[0]
+ return result
execute.func_name = 'execute_' + opname
return execute
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_dependency.py b/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
@@ -12,6 +12,7 @@
from rpython.rtyper.lltypesystem import rffi
from rpython.rtyper.lltypesystem import lltype
from rpython.conftest import option
+from rpython.jit.metainterp.compile import invent_fail_descr_for_op
class FakeDependencyGraph(DependencyGraph):
""" A dependency graph that is able to emit every instruction
@@ -45,6 +46,9 @@
def parse_loop(self, ops, add_label=True):
loop = self.parse(ops, postprocess=self.postprocess)
loop.operations = filter(lambda op: op.getopnum() != rop.DEBUG_MERGE_POINT, loop.operations)
+ #for op in loop.operations:
+ # if op.is_guard() and op.getdescr() is None:
+ # op.setdescr(invent_fail_descr_for_op(op.opnum, None))
token = JitCellToken()
if add_label:
label = ResOperation(rop.LABEL, loop.inputargs, descr=TargetToken(token))
diff --git a/rpython/jit/metainterp/optimizeopt/vector.py b/rpython/jit/metainterp/optimizeopt/vector.py
--- a/rpython/jit/metainterp/optimizeopt/vector.py
+++ b/rpython/jit/metainterp/optimizeopt/vector.py
@@ -555,7 +555,6 @@
self.mark_guard(guard_node, loop)
for node in zero_deps.keys():
assert not node.is_imaginary()
- print "edge to", node
earlyexit.edge_to(node)
if one_valid:
return graph
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
@@ -116,11 +116,6 @@
_mixin_ = True
def inittype(self):
- if self.returns_void():
- self.bytesize = 0
- self.datatype = 'v'
- return
-
if self.is_primitive_array_access():
from rpython.jit.backend.llsupport.descr import ArrayDescr
descr = self.getdescr()
@@ -149,31 +144,24 @@
self.setdatatype(tt, self.cast_to_bytesize(), tt == 'i')
else:
# pass through the type of the first input argument
- if self.numargs() == 0:
- if self.type == 'i':
- self.setdatatype('i', INT_WORD, True)
- elif self.type == 'f':
- self.setdatatype('f', FLOAT_WORD, False)
- return
- i = 0
- arg = self.getarg(i)
- while arg.is_constant() and i+1 < self.numargs():
- i += 1
+ type = self.type
+ signed = type == 'i'
+ bytesize = -1
+ if self.numargs() > 0:
+ i = 0
arg = self.getarg(i)
- if arg.is_constant() or arg.datatype == '\x00':
- if arg.type == 'i':
- self.setdatatype('i', INT_WORD, True)
- elif arg.type == 'f':
- self.setdatatype('f', FLOAT_WORD, False)
- else:
- assert arg.type == 'r'
- self.setdatatype('r', INT_WORD, False)
- return
- self.setdatatype(arg.datatype, arg.bytesize, arg.signed)
+ while arg.is_constant() and i+1 < self.numargs():
+ i += 1
+ arg = self.getarg(i)
+ if arg.datatype != '\x00' and \
+ arg.bytesize != -1:
+ type = arg.datatype
+ signed = arg.signed
+ bytesize = arg.bytesize
if self.returns_bool_result():
- self.datatype = 'i'
+ type = 'i'
+ self.setdatatype(type, bytesize, signed)
assert self.datatype != '\x00'
- #assert self.bytesize > 0
def setdatatype(self, data_type, bytesize, signed):
self.datatype = data_type
@@ -182,6 +170,8 @@
bytesize = INT_WORD
elif data_type == 'f':
bytesize = FLOAT_WORD
+ elif data_type == 'v':
+ bytesize = 0
self.bytesize = bytesize
self.signed = signed
@@ -1190,10 +1180,10 @@
'VEC_CAST_FLOAT_TO_INT': ('f', 8, 'i', 4, 2),
'CAST_INT_TO_FLOAT': ('i', 4, 'f', 8, 2),
'VEC_CAST_INT_TO_FLOAT': ('i', 4, 'f', 8, 2),
- 'CAST_FLOAT_TO_SINGLEFLOAT': ('f', 8, 'f', 4, 2),
- 'VEC_CAST_FLOAT_TO_SINGLEFLOAT': ('f', 8, 'f', 4, 2),
- 'CAST_SINGLEFLOAT_TO_FLOAT': ('f', 4, 'f', 8, 2),
- 'VEC_CAST_SINGLEFLOAT_TO_FLOAT': ('f', 4, 'f', 8, 2),
+ 'CAST_FLOAT_TO_SINGLEFLOAT': ('f', 8, 'i', 4, 2),
+ 'VEC_CAST_FLOAT_TO_SINGLEFLOAT': ('f', 8, 'i', 4, 2),
+ 'CAST_SINGLEFLOAT_TO_FLOAT': ('i', 4, 'f', 8, 2),
+ 'VEC_CAST_SINGLEFLOAT_TO_FLOAT': ('i', 4, 'f', 8, 2),
'INT_SIGNEXT': ('i', 0, 'i', 0, 0),
'VEC_INT_SIGNEXT': ('i', 0, 'i', 0, 0),
}
diff --git a/rpython/jit/metainterp/test/test_resoperation.py b/rpython/jit/metainterp/test/test_resoperation.py
--- a/rpython/jit/metainterp/test/test_resoperation.py
+++ b/rpython/jit/metainterp/test/test_resoperation.py
@@ -3,6 +3,8 @@
from rpython.jit.metainterp import resoperation as rop
from rpython.jit.metainterp.history import AbstractDescr, AbstractFailDescr
from rpython.jit.metainterp.history import ConstInt
+from rpython.jit.backend.llsupport.symbolic import (WORD as INT_WORD,
+ SIZEOF_FLOAT as FLOAT_WORD)
def test_arity_mixins():
cases = [
@@ -91,3 +93,13 @@
op = rop.ResOperation(rop.rop.CAST_FLOAT_TO_INT, ['a'], 'c')
assert op.casts_box()
assert isinstance(op, rop.CastResOp)
+
+def test_types():
+ op = rop.ResOperation(rop.rop.INT_ADD, [ConstInt(0),ConstInt(1)])
+ assert op.type == 'i'
+ assert op.datatype == 'i'
+ assert op.bytesize == INT_WORD
+ op = rop.ResOperation(rop.rop.VEC_CAST_FLOAT_TO_SINGLEFLOAT, [op])
+ assert op.type == 'i'
+ assert op.datatype == 'i'
+ assert op.bytesize == 4
diff --git a/rpython/jit/metainterp/test/test_resume.py b/rpython/jit/metainterp/test/test_resume.py
--- a/rpython/jit/metainterp/test/test_resume.py
+++ b/rpython/jit/metainterp/test/test_resume.py
@@ -1417,7 +1417,8 @@
assert not storage.rd_pendingfields
#
class FieldDescr(AbstractDescr):
- pass
+ def is_array_of_primitives(self):
+ return False
field_a = FieldDescr()
storage = Storage()
modifier = ResumeDataVirtualAdder(None, storage, storage, None)
diff --git a/rpython/jit/metainterp/warmspot.py b/rpython/jit/metainterp/warmspot.py
--- a/rpython/jit/metainterp/warmspot.py
+++ b/rpython/jit/metainterp/warmspot.py
@@ -177,7 +177,6 @@
def reset_jit():
"""Helper for some tests (see micronumpy/test/test_zjit.py)"""
- from rpython.jit.metainterp import counter
reset_stats()
pyjitpl._warmrunnerdesc.memory_manager.alive_loops.clear()
pyjitpl._warmrunnerdesc.jitcounter._clear_all()
More information about the pypy-commit
mailing list