Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r74503:4fe0a963f8a3
Date: 2014-11-13 15:22 +0200
http://bitbucket.org/pypy/pypy/changeset/4fe0a963f8a3/
Log: small progres
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
@@ -6,9 +6,8 @@
from rpython.conftest import option
-from rpython.jit.metainterp.resoperation import ResOperation, rop
+from rpython.jit.metainterp.resoperation import ResOperation, rop,
AbstractValue
from rpython.jit.codewriter import heaptracker, longlong
-from rpython.rlib.objectmodel import compute_identity_hash
import weakref
# ____________________________________________________________
@@ -72,7 +71,7 @@
compute_unique_id(box))
-class AbstractValue(object):
+class XxxAbstractValue(object):
__slots__ = ()
def getint(self):
@@ -95,9 +94,6 @@
raise NotImplementedError
getref._annspecialcase_ = 'specialize:arg(1)'
- def _get_hash_(self):
- return compute_identity_hash(self)
-
def clonebox(self):
raise NotImplementedError
diff --git a/rpython/jit/metainterp/optimizeopt/earlyforce.py
b/rpython/jit/metainterp/optimizeopt/earlyforce.py
--- a/rpython/jit/metainterp/optimizeopt/earlyforce.py
+++ b/rpython/jit/metainterp/optimizeopt/earlyforce.py
@@ -4,7 +4,7 @@
def is_raw_free(op, opnum):
- if opnum != rop.CALL:
+ if not op.is_call():
return False
einfo = op.getdescr().get_extra_info()
return einfo.oopspecindex == EffectInfo.OS_RAW_FREE
@@ -18,7 +18,9 @@
opnum != rop.SETARRAYITEM_GC and
opnum != rop.SETARRAYITEM_RAW and
opnum != rop.QUASIIMMUT_FIELD and
- opnum != rop.SAME_AS and
+ opnum != rop.SAME_AS_I and
+ opnum != rop.SAME_AS_R and
+ opnum != rop.SAME_AS_F and
opnum != rop.MARK_OPAQUE_PTR and
not is_raw_free(op, opnum)):
diff --git a/rpython/jit/metainterp/optimizeopt/heap.py
b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -248,7 +248,7 @@
def emit_operation(self, op):
self.emitting_operation(op)
self.emit_postponed_op()
- if (op.is_comparison() or op.getopnum() == rop.CALL_MAY_FORCE
+ if (op.is_comparison() or op.is_call_may_force()
or op.is_ovf()):
self.postponed_op = op
else:
@@ -276,13 +276,8 @@
opnum == rop.COPYSTRCONTENT or # no effect on GC struct/array
opnum == rop.COPYUNICODECONTENT): # no effect on GC struct/array
return
- if (opnum == rop.CALL or
- opnum == rop.CALL_PURE or
- opnum == rop.COND_CALL or
- opnum == rop.CALL_MAY_FORCE or
- opnum == rop.CALL_RELEASE_GIL or
- opnum == rop.CALL_ASSEMBLER):
- if opnum == rop.CALL_ASSEMBLER:
+ if op.is_call():
+ if op.is_call_assembler():
self._seen_guard_not_invalidated = False
else:
effectinfo = op.getdescr().get_extra_info()
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py
b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -551,7 +551,7 @@
@specialize.argtype(0)
def _emit_operation(self, op):
- assert op.getopnum() != rop.CALL_PURE
+ assert not op.is_call_pure()
for i in range(op.numargs()):
arg = op.getarg(i)
try:
@@ -598,7 +598,8 @@
modifier = resume.ResumeDataVirtualAdder(descr, self.resumedata_memo)
try:
newboxes = modifier.finish(self, pendingfields)
- if len(newboxes) > self.metainterp_sd.options.failargs_limit:
+ if (newboxes is not None and
+ len(newboxes) > self.metainterp_sd.options.failargs_limit):
raise resume.TagOverflow
except resume.TagOverflow:
raise compile.giveup()
@@ -625,11 +626,11 @@
descr.make_a_counter_per_value(op)
return op
- def make_args_key(self, op):
- n = op.numargs()
+ def make_args_key(self, opnum, arglist, descr):
+ n = len(arglist)
args = [None] * (n + 2)
for i in range(n):
- arg = op.getarg(i)
+ arg = arglist[i]
try:
value = self.values[arg]
except KeyError:
@@ -637,8 +638,8 @@
else:
arg = value.get_key_box()
args[i] = arg
- args[n] = ConstInt(op.getopnum())
- args[n + 1] = op.getdescr()
+ args[n] = ConstInt(opnum)
+ args[n + 1] = descr
return args
def optimize_default(self, op):
diff --git a/rpython/jit/metainterp/optimizeopt/pure.py
b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -105,7 +105,7 @@
op = ResOperation(opnum, args, result)
key = self.optimizer.make_args_key(op)
if key not in self.pure_operations:
- self.pure_operations[key] = op
+ self.pure_operations[key] = result
def has_pure_result(self, opnum, args, descr):
op = ResOperation(opnum, args, None, descr)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_multilabel.py
b/rpython/jit/metainterp/optimizeopt/test/test_multilabel.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_multilabel.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_multilabel.py
@@ -1,6 +1,6 @@
from __future__ import with_statement
from rpython.jit.metainterp.optimizeopt.test.test_util import (
- LLtypeMixin, BaseTest, Storage, _sortboxes,
+ LLtypeMixin, BaseTest, Storage,
FakeMetaInterpStaticData)
from rpython.jit.metainterp.history import TreeLoop, JitCellToken, TargetToken
from rpython.jit.metainterp.resoperation import rop, opname, ResOperation
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -338,21 +338,11 @@
class Storage(compile.ResumeGuardDescr):
"for tests."
- def __init__(self, metainterp_sd=None, original_greenkey=None):
- self.metainterp_sd = metainterp_sd
- self.original_greenkey = original_greenkey
- def store_final_boxes(self, op, boxes, metainterp_sd):
- op.setfailargs(boxes)
- def __eq__(self, other):
- return type(self) is type(other) # xxx obscure
def clone_if_mutable(self):
- res = Storage(self.metainterp_sd, self.original_greenkey)
- self.copy_all_attributes_into(res)
- return res
+ return Storage()
-def _sortboxes(boxes):
- _kind2count = {history.INT: 1, history.REF: 2, history.FLOAT: 3}
- return sorted(boxes, key=lambda box: _kind2count[box.type])
+ def store_final_boxes(self, *args):
+ pass
class BaseTest(object):
@@ -376,8 +366,6 @@
if fail_args is None:
return None
descr = Storage()
- descr.rd_frame_info_list = resume.FrameInfo(None, "code", 11)
- descr.rd_snapshot = resume.Snapshot(None, _sortboxes(fail_args))
return descr
def assert_equal(self, optimized, expected, text_right=None):
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
@@ -1,7 +1,9 @@
from rpython.rlib.objectmodel import we_are_translated, specialize
+from rpython.rlib.objectmodel import compute_identity_hash
class AbstractValue(object):
- pass
+ def _get_hash_(self):
+ return compute_identity_hash(self)
@specialize.argtype(2)
def ResOperation(opnum, args, result, descr=None):
@@ -36,6 +38,7 @@
pc = 0
opnum = 0
_cls_has_bool_result = False
+ type = 'v'
_attrs_ = ()
@@ -177,6 +180,27 @@
def is_call(self):
return rop._CALL_FIRST <= self.getopnum() <= rop._CALL_LAST
+ def is_call_assembler(self):
+ opnum = self.opnum
+ return (opnum == rop.CALL_ASSEMBLER_I or
+ opnum == rop.CALL_ASSEMBLER_R or
+ opnum == rop.CALL_ASSEMBLER_N or
+ opnum == rop.CALL_ASSEMBLER_F)
+
+ def is_call_may_force(self):
+ opnum = self.opnum
+ return (opnum == rop.CALL_MAY_FORCE_I or
+ opnum == rop.CALL_MAY_FORCE_R or
+ opnum == rop.CALL_MAY_FORCE_N or
+ opnum == rop.CALL_MAY_FORCE_F)
+
+ def is_call_pure(self):
+ opnum = self.opnum
+ return (opnum == rop.CALL_PURE_I or
+ opnum == rop.CALL_PURE_R or
+ opnum == rop.CALL_PURE_N or
+ opnum == rop.CALL_PURE_F)
+
def is_ovf(self):
return rop._OVF_FIRST <= self.getopnum() <= rop._OVF_LAST
@@ -251,6 +275,8 @@
class IntOp(object):
_mixin_ = True
+ type = 'i'
+
def getint(self):
return self._resint
@@ -260,6 +286,8 @@
class FloatOp(object):
_mixin_ = True
+ type = 'f'
+
def getfloatstorage(self):
return self._resfloat
@@ -269,6 +297,8 @@
class RefOp(object):
_mixin_ = True
+ type = 'r'
+
def getref_base(self):
return self._resref
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -358,7 +358,9 @@
# make sure that nobody attached resume data to this guard yet
assert not storage.rd_numb
snapshot = storage.rd_snapshot
- assert snapshot is not None # is that true?
+ if snapshot is None:
+ assert not we_are_translated()
+ return # for tests in optimizeopt
numb, liveboxes_from_env, v = self.memo.number(optimizer, snapshot)
self.liveboxes_from_env = liveboxes_from_env
self.liveboxes = {}
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
@@ -23,7 +23,7 @@
return 'escape'
def clone(self):
- op = ESCAPE_OP(self.result)
+ op = ESCAPE_OP(0)
op.initarglist(self.getarglist()[:])
return op
@@ -38,7 +38,7 @@
return 'force_spill'
def clone(self):
- op = FORCE_SPILL(self.result)
+ op = FORCE_SPILL(0)
op.initarglist(self.getarglist()[:])
return op
@@ -265,12 +265,12 @@
def create_op(self, opnum, args, descr):
if opnum == ESCAPE_OP.OPNUM:
- op = ESCAPE_OP()
+ op = ESCAPE_OP(0)
op.initarglist(args)
assert descr is None
return op
if opnum == FORCE_SPILL.OPNUM:
- op = FORCE_SPILL()
+ op = FORCE_SPILL(0)
op.initarglist(args)
assert descr is None
return op
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit