[pypy-commit] pypy optresult: hack oparser to pass it's own tests. Don't care about the obscure features for now
fijal
noreply at buildbot.pypy.org
Thu Nov 13 14:23:39 CET 2014
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r74501:82186084fb67
Date: 2014-11-12 14:24 +0200
http://bitbucket.org/pypy/pypy/changeset/82186084fb67/
Log: hack oparser to pass it's own tests. Don't care about the obscure
features for now
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
@@ -19,6 +19,8 @@
op._resint = result
elif isinstance(result, float):
op._resfloat = result
+ elif result is None:
+ pass
else:
from rpython.rtyper.lltypesystem import lltype, llmemory
assert lltype.typeOf(result) == llmemory.GCREF
@@ -274,13 +276,16 @@
self._resref = refval
class InputArgInt(IntOp, AbstractValue):
- pass
+ def __init__(self, intval):
+ self.setint(intval)
class InputArgFloat(FloatOp, AbstractValue):
- pass
+ def __init__(self, f):
+ self.setfloatstorage(f)
-class InputArgRef(FloatOp, AbstractValue):
- pass
+class InputArgRef(RefOp, AbstractValue):
+ def __init__(self, r):
+ self.setref_base(r)
# ============
# arity mixins
@@ -619,7 +624,7 @@
opname = {} # mapping numbers to the original names, for debugging
oparity = [] # mapping numbers to the arity of the operation or -1
opwithdescr = [] # mapping numbers to a flag "takes a descr"
-
+optypes = [] # mapping numbers to type of return
def setup(debug_print=False):
i = 0
@@ -648,6 +653,7 @@
opclasses.append(cls)
oparity.append(arity)
opwithdescr.append(withdescr)
+ optypes.append(r)
if debug_print:
print '%30s = %d' % (cls_name, i)
i += 1
@@ -656,6 +662,7 @@
opclasses.append(None)
oparity.append(-1)
opwithdescr.append(False)
+ optypes.append(' ')
if debug_print:
print '%30s = %d' % (name, i)
i += 1
diff --git a/rpython/jit/tool/oparser.py b/rpython/jit/tool/oparser.py
--- a/rpython/jit/tool/oparser.py
+++ b/rpython/jit/tool/oparser.py
@@ -6,8 +6,8 @@
from rpython.jit.tool.oparser_model import get_model
from rpython.jit.metainterp.resoperation import rop, ResOperation, \
- ResOpWithDescr, N_aryOp, \
- UnaryOp, PlainResOp
+ InputArgInt, InputArgRef, InputArgFloat, ResOpWithDescr, N_aryOp, \
+ UnaryOp, PlainResOp, optypes
class ParseError(Exception):
pass
@@ -103,6 +103,7 @@
raise
def box_for_var(self, elem):
+ xxx
try:
return self._cache[self.type_system, elem]
except KeyError:
@@ -135,9 +136,21 @@
vars = []
for elem in elements:
elem = elem.strip()
- vars.append(self.newvar(elem))
+ vars.append(self.newinputarg(elem))
return vars
+ def newinputarg(self, elem):
+ if elem.startswith('i'):
+ v = InputArgInt(0)
+ elif elem.startswith('f'):
+ v = InputArgFloat(0.0)
+ else:
+ from rpython.rtyper.lltypesystem import lltype, llmemory
+ assert elem.startswith('p')
+ v = InputArgRef(lltype.nullptr(llmemory.GCREF.TO))
+ self.vars[elem] = v
+ return v
+
def newvar(self, elem):
box = self.box_for_var(elem)
self.vars[elem] = box
@@ -250,18 +263,29 @@
return opnum, args, descr, fail_args
- def create_op(self, opnum, args, result, descr):
+ def create_op(self, opnum, args, descr):
if opnum == ESCAPE_OP.OPNUM:
- op = ESCAPE_OP(result)
+ op = ESCAPE_OP()
op.initarglist(args)
assert descr is None
return op
if opnum == FORCE_SPILL.OPNUM:
- op = FORCE_SPILL(result)
+ op = FORCE_SPILL()
op.initarglist(args)
assert descr is None
return op
else:
+ tp = optypes[opnum]
+ if tp == 'i':
+ result = 0
+ elif tp == 'r':
+ from rpython.rtyper.lltypesystem import lltype, llmemory
+ result = lltype.nullptr(llmemory.GCREF.TO)
+ elif tp == 'f':
+ result = 0.0
+ else:
+ assert tp == 'n'
+ result = None
return ResOperation(opnum, args, result, descr)
def parse_result_op(self, line):
@@ -271,16 +295,15 @@
opnum, args, descr, fail_args = self.parse_op(op)
if res in self.vars:
raise ParseError("Double assign to var %s in line: %s" % (res, line))
- rvar = self.box_for_var(res)
- self.vars[res] = rvar
- res = self.create_op(opnum, args, rvar, descr)
+ resop = self.create_op(opnum, args, descr)
if fail_args is not None:
- res.setfailargs(fail_args)
- return res
+ resop.setfailargs(fail_args)
+ self.vars[res] = resop
+ return resop
def parse_op_no_result(self, line):
opnum, args, descr, fail_args = self.parse_op(line)
- res = self.create_op(opnum, args, None, descr)
+ res = self.create_op(opnum, args, descr)
if fail_args is not None:
res.setfailargs(fail_args)
return res
diff --git a/rpython/jit/tool/test/test_oparser.py b/rpython/jit/tool/test/test_oparser.py
--- a/rpython/jit/tool/test/test_oparser.py
+++ b/rpython/jit/tool/test/test_oparser.py
@@ -48,7 +48,7 @@
x = """
[p0]
- i1 = getfield_gc(p0, descr=stuff)
+ i1 = getfield_gc_i(p0, descr=stuff)
"""
stuff = Xyz()
loop = self.parse(x, None, locals())
@@ -75,39 +75,10 @@
loop = self.parse(x, None, locals())
assert loop.operations[0].getdescr() is stuff
- def test_boxname(self):
- x = """
- [i42]
- i50 = int_add(i42, 1)
- """
- loop = self.parse(x, None, {})
- assert str(loop.inputargs[0]) == 'i42'
- assert str(loop.operations[0].result) == 'i50'
-
- def test_getboxes(self):
- x = """
- [i0]
- i1 = int_add(i0, 10)
- """
- loop = self.parse(x, None, {})
- boxes = loop.getboxes()
- assert boxes.i0 is loop.inputargs[0]
- assert boxes.i1 is loop.operations[0].result
-
- def test_setvalues(self):
- x = """
- [i0]
- i1 = int_add(i0, 10)
- """
- loop = self.parse(x, None, {})
- loop.setvalues(i0=32, i1=42)
- assert loop.inputargs[0].value == 32
- assert loop.operations[0].result.value == 42
-
def test_getvar_const_ptr(self):
x = '''
[]
- call(ConstPtr(func_ptr))
+ call_n(ConstPtr(func_ptr))
'''
TP = lltype.GcArray(lltype.Signed)
NULL = lltype.cast_opaque_ptr(llmemory.GCREF, lltype.nullptr(TP))
@@ -141,7 +112,7 @@
box = loop.operations[0].getarg(0)
# we cannot use isinstance, because in case of mock the class will be
# constructed on the fly
- assert box.__class__.__name__ == 'BoxFloat'
+ assert box.__class__.__name__ == 'InputArgFloat'
def test_debug_merge_point(self):
x = '''
@@ -203,14 +174,6 @@
loop = self.parse(x, nonstrict=True)
assert loop.operations[0].getfailargs() == []
- def test_no_inputargs(self):
- x = '''
- i2 = int_add(i0, i1)
- '''
- loop = self.parse(x, nonstrict=True)
- assert loop.inputargs == []
- assert loop.operations[0].getopname() == 'int_add'
-
def test_offsets(self):
x = """
[i0, i1]
@@ -238,14 +201,6 @@
OpParser = OpParser
- def test_boxkind(self):
- x = """
- [sum0]
- """
- loop = self.parse(x, None, {}, boxkinds={'sum': BoxInt})
- b = loop.getboxes()
- assert isinstance(b.sum0, BoxInt)
-
def test_label(self):
x = """
[i0]
More information about the pypy-commit
mailing list