Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79222:d878ab104991
Date: 2015-08-25 12:50 +0200
http://bitbucket.org/pypy/pypy/changeset/d878ab104991/
Log: implement force_at_the_end_of_preamble for now
diff --git a/rpython/jit/metainterp/optimizeopt/info.py
b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -35,6 +35,11 @@
def is_virtual(self):
return False
+ def force_at_the_end_of_preamble(self, op, optforce, rec):
+ if not self.is_virtual():
+ return optforce.get_box_replacement(op)
+ return self._force_at_the_end_of_preamble(op, optforce, rec)
+
def get_known_class(self, cpu):
return None
@@ -115,6 +120,9 @@
return newop
return op
+ def _force_at_the_end_of_preamble(self, op, optforce, rec):
+ return self.force_box(op, optforce)
+
def is_virtual(self):
return self.vdescr is not None
@@ -170,6 +178,21 @@
else:
optforce.emit_operation(setfieldop)
+ def _force_at_the_end_of_preamble(self, op, optforce, rec):
+ if self._fields is None:
+ return optforce.get_box_replacement(op)
+ if self in rec:
+ return optforce.get_box_replacement(op)
+ rec[self] = None
+ for i, fldbox in enumerate(self._fields):
+ if fldbox is not None:
+ info = optforce.getptrinfo(fldbox)
+ if info is not None:
+ fldbox = info.force_at_the_end_of_preamble(fldbox,
optforce,
+ rec)
+ self._fields[i] = fldbox
+ return op
+
def _visitor_walk_recursive(self, instbox, visitor, optimizer):
lst = self.vdescr.get_all_fielddescrs()
assert self.is_virtual()
@@ -425,6 +448,21 @@
descr=descr)
shortboxes.add_heap_op(op, getarrayitem_op)
+ def _force_at_the_end_of_preamble(self, op, optforce, rec):
+ if self._items is None:
+ return optforce.get_box_replacement(op)
+ if self in rec:
+ return optforce.get_box_replacement(op)
+ rec[self] = None
+ for i, fldbox in enumerate(self._items):
+ if fldbox is not None:
+ info = optforce.getptrinfo(fldbox)
+ if info is not None:
+ fldbox = info.force_at_the_end_of_preamble(fldbox,
optforce,
+ rec)
+ self._items[i] = fldbox
+ return op
+
def make_guards(self, op, short):
AbstractVirtualPtrInfo.make_guards(self, op, short)
if self.lenbound is not None:
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
@@ -144,7 +144,7 @@
return self.optimizer.get_box_replacement(op, not_const=not_const)
def getlastop(self):
- return self.optimizer._last_emitted_op
+ return self.optimizer.getlastop()
def replace_op_with(self, op, newopnum, args=None, descr=None):
return self.optimizer.replace_op_with(op, newopnum, args, descr)
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -193,8 +193,8 @@
def jump_to_existing_trace(self, jump_op):
jitcelltoken = jump_op.getdescr()
+ virtual_state = self.get_virtual_state(jump_op.getarglist())
args = [self.get_box_replacement(op) for op in jump_op.getarglist()]
- virtual_state = self.get_virtual_state(args)
infos = [self.optimizer.getinfo(arg) for arg in args]
for target_token in jitcelltoken.target_tokens:
target_virtual_state = target_token.virtual_state
@@ -202,8 +202,7 @@
continue
try:
extra_guards = target_virtual_state.generate_guards(
- virtual_state, jump_op.getarglist(), infos,
- self.optimizer.cpu)
+ virtual_state, args, infos, self.optimizer.cpu)
patchguardop = self.optimizer.patchguardop
for guard in extra_guards.extra_guards:
if isinstance(guard, GuardResOp):
@@ -258,8 +257,8 @@
op.set_forwarded(None)
def export_state(self, start_label, original_label_args,
renamed_inputargs):
+ virtual_state = self.get_virtual_state(original_label_args)
end_args = [self.get_box_replacement(a) for a in original_label_args]
- virtual_state = self.get_virtual_state(end_args)
infos = {}
for arg in end_args:
infos[arg] = self.optimizer.getinfo(arg)
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py
b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -609,6 +609,9 @@
pass
if box.type == 'r':
info = opt.getptrinfo(box)
+ if info is not None:
+ rec = {}
+ box = info.force_at_the_end_of_preamble(box, opt.optimizer,
rec)
if info is not None and info.is_virtual():
result = info.visitor_dispatch_virtual_type(self)
self.info[box] = result
diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py
b/rpython/jit/metainterp/optimizeopt/vstring.py
--- a/rpython/jit/metainterp/optimizeopt/vstring.py
+++ b/rpython/jit/metainterp/optimizeopt/vstring.py
@@ -502,17 +502,20 @@
def make_vstring_plain(self, op, mode, length):
vvalue = VStringPlainInfo(mode, True, length)
- self.make_equal_to(op, vvalue)
+ op = self.replace_op_with(op, op.getopnum())
+ op.set_forwarded(vvalue)
return vvalue
def make_vstring_concat(self, op, mode, vleft, vright):
vvalue = VStringConcatInfo(mode, vleft, vright, True)
- self.make_equal_to(op, vvalue)
+ op = self.replace_op_with(op, op.getopnum())
+ op.set_forwarded(vvalue)
return vvalue
def make_vstring_slice(self, op, strbox, startbox, mode, lengthbox):
vvalue = VStringSliceInfo(strbox, startbox, lengthbox, mode)
- self.make_equal_to(op, vvalue)
+ op = self.replace_op_with(op, op.getopnum())
+ op.set_forwarded(vvalue)
return vvalue
def optimize_NEWSTR(self, op):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit