[pypy-commit] pypy optresult-unroll: a fix to force the right virtual state if we have one, maybe we can simplify jump_to_existing trace just by passing one
fijal
noreply at buildbot.pypy.org
Wed Sep 2 11:39:03 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79368:ededaf3d4b4d
Date: 2015-09-02 11:38 +0200
http://bitbucket.org/pypy/pypy/changeset/ededaf3d4b4d/
Log: a fix to force the right virtual state if we have one, maybe we can
simplify jump_to_existing trace just by passing one
diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -562,7 +562,7 @@
frame_depth = max(self.current_clt.frame_info.jfi_frame_depth,
frame_depth_no_fixed_size + JITFRAME_FIXED_SIZE)
if logger:
- logger.log_bridge(inputargs, operations, "rewritten",
+ logger.log_bridge(inputargs, operations, "rewritten", faildescr,
ops_offset=ops_offset)
self.fixup_target_tokens(rawstart)
self.update_frame_depth(frame_depth)
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
@@ -3,6 +3,7 @@
from rpython.jit.metainterp.optimizeopt.shortpreamble import ShortBoxes,\
ShortPreambleBuilder, ExtendedShortPreambleBuilder, PreambleOp
from rpython.jit.metainterp.optimizeopt import info, intutils
+from rpython.jit.metainterp.optimize import InvalidLoop
from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer,\
Optimization, LoopInfo, MININT, MAXINT
from rpython.jit.metainterp.optimizeopt.vstring import StrPtrInfo
@@ -122,7 +123,18 @@
start_label.getarglist()[:], ops, call_pure_results, False,
flush=False)
label_op = ResOperation(rop.LABEL, label_args, start_label.getdescr())
- args = state.virtual_state.make_inputargs(
+ for a in end_jump.getarglist():
+ self.optimizer.force_box_for_end_of_preamble(
+ self.optimizer.get_box_replacement(a))
+ current_vs = self.get_virtual_state(end_jump.getarglist())
+ # pick the vs we want to jump to
+ celltoken = start_label.getdescr()
+ assert isinstance(celltoken, JitCellToken)
+ target_virtual_state = self.pick_virtual_state(current_vs,
+ state.virtual_state,
+ celltoken.target_tokens)
+ # force the boxes for virtual state to match
+ args = target_virtual_state.make_inputargs(
[self.get_box_replacement(x) for x in end_jump.getarglist()],
self.optimizer, force_boxes=True)
for arg in args:
@@ -131,11 +143,8 @@
target_token = self.finalize_short_preamble(label_op,
state.virtual_state)
label_op.setdescr(target_token)
- # force the boxes for virtual state to match
new_virtual_state = self.jump_to_existing_trace(end_jump, label_op)
if new_virtual_state is not None:
- celltoken = start_label.getdescr()
- assert isinstance(celltoken, JitCellToken)
self.jump_to_preamble(celltoken, end_jump, info)
return (UnrollInfo(target_token, label_op, [],
self.optimizer.quasi_immutable_deps),
@@ -144,6 +153,16 @@
self.optimizer.quasi_immutable_deps),
self.optimizer._newoperations)
+ def pick_virtual_state(self, my_vs, label_vs, target_tokens):
+ if target_tokens is None:
+ return label_vs # for tests
+ for token in target_tokens:
+ if token.virtual_state is None:
+ continue
+ if token.virtual_state.generalization_of(my_vs, self.optimizer):
+ return token.virtual_state
+ return label_vs
+
def optimize_bridge(self, start_label, operations, call_pure_results,
inline_short_preamble):
self._check_no_forwarding([start_label.getarglist(),
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
@@ -145,10 +145,12 @@
assert isinstance(other, AbstractVirtualStructStateInfo)
assert len(self.fielddescrs) == len(self.fieldstate)
assert len(other.fielddescrs) == len(other.fieldstate)
- opinfo = state.optimizer.getptrinfo(box)
if runtime_box is not None:
+ opinfo = state.optimizer.getptrinfo(box)
assert opinfo.is_virtual()
- assert isinstance(opinfo, AbstractStructPtrInfo)
+ assert isinstance(opinfo, AbstractStructPtrInfo)
+ else:
+ opinfo = None
if len(self.fielddescrs) != len(other.fielddescrs):
raise VirtualStatesCantMatch("field descrs don't match")
@@ -551,8 +553,8 @@
if s:
s.enum(self)
- def generalization_of(self, other, bad=None, cpu=None):
- state = GenerateGuardState(cpu=cpu, bad=bad)
+ def generalization_of(self, other, optimizer):
+ state = GenerateGuardState(optimizer)
assert len(self.state) == len(other.state)
try:
for i in range(len(self.state)):
diff --git a/rpython/jit/metainterp/test/test_virtual.py b/rpython/jit/metainterp/test/test_virtual.py
--- a/rpython/jit/metainterp/test/test_virtual.py
+++ b/rpython/jit/metainterp/test/test_virtual.py
@@ -214,7 +214,7 @@
assert res == f(20)
self.check_trace_count(2)
self.check_resops(**{self._new_op: 1})
- self.check_resops(int_mul=0, call=1)
+ self.check_resops(int_mul=0, call_i=1)
def test_two_virtuals(self):
myjitdriver = JitDriver(greens=[], reds=['n', 'prev'])
More information about the pypy-commit
mailing list