Author: Maciej Fijalkowski <[email protected]>
Branch: kill-gen-store-back-in
Changeset: r64576:7c4ed9c84edd
Date: 2013-05-27 12:30 +0200
http://bitbucket.org/pypy/pypy/changeset/7c4ed9c84edd/
Log: use a different guard name, so the optimizer does not get confused.
Saves some hacks, but is definitely not pretty
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
@@ -787,6 +787,7 @@
saved_data = self.forced_deadframe._saved_data
self.fail_guard(descr, saved_data)
self.force_guard_op = self.current_op
+ execute_guard_not_forced_2 = execute_guard_not_forced
def execute_guard_not_invalidated(self, descr):
if self.lltrace.invalid:
@@ -922,6 +923,16 @@
#
# Emulate the fast path
#
+ faildescr = self.cpu.get_latest_descr(pframe)
+ if faildescr == self.cpu.done_with_this_frame_descr_int:
+ return self.cpu.get_int_value(pframe, 0)
+ elif faildescr == self.cpu.done_with_this_frame_descr_ref:
+ return self.cpu.get_ref_value(pframe, 0)
+ elif faildescr == self.cpu.done_with_this_frame_descr_float:
+ return self.cpu.get_float_value(pframe, 0)
+ elif faildescr == self.cpu.done_with_this_frame_descr_void:
+ return None
+
assembler_helper_ptr = jd.assembler_helper_adr.ptr # fish
try:
result = assembler_helper_ptr(pframe, vable)
diff --git a/rpython/jit/backend/x86/regalloc.py
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -1336,7 +1336,7 @@
#if jump_op is not None and jump_op.getdescr() is descr:
# self._compute_hint_frame_locations_from_descr(descr)
- def consider_guard_not_forced(self, op):
+ def consider_guard_not_forced_2(self, op):
self.rm.before_call([], save_all_regs=True)
fail_locs = [self.loc(v) for v in op.getfailargs()]
self.assembler.store_force_descr(op, fail_locs,
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -5102,6 +5102,15 @@
}
self.optimize_loop(ops, expected, call_pure_results)
+ def test_guard_not_forced_2_virtual(self):
+ ops = """
+ [i0]
+ p0 = new_array(3, descr=arraydescr)
+ guard_not_forced_2() [p0]
+ finish(p0)
+ """
+ self.optimize_loop(ops, ops)
+
class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
pass
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py
b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -481,6 +481,8 @@
class OptVirtualize(optimizer.Optimization):
"Virtualize objects until they escape."
+ _last_guard_not_forced = None
+
def new(self):
return OptVirtualize()
@@ -524,6 +526,18 @@
return
self.emit_operation(op)
+ def optimize_GUARD_NOT_FORCED_2(self, op):
+ self._last_guard_not_forced = op
+
+ def optimize_FINISH(self, op):
+ if self._last_guard_not_forced is not None:
+ guard_op = self._last_guard_not_forced
+ self.emit_operation(op)
+ guard_op = self.optimizer.store_final_boxes_in_guard(guard_op)
+ self.optimizer._newoperations.insert(-1, guard_op)
+ else:
+ self.emit_operation(op)
+
def optimize_FORCE_VIRTUALIZABLE(self, op):
val = self.getvalue(op.getarg(0))
if val.is_virtual():
diff --git a/rpython/jit/metainterp/pyjitpl.py
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -1741,7 +1741,7 @@
else:
moreargs = list(extraargs)
metainterp_sd = self.staticdata
- if opnum == rop.GUARD_NOT_FORCED:
+ if opnum == rop.GUARD_NOT_FORCED or opnum == rop.GUARD_NOT_FORCED_2:
resumedescr = compile.ResumeGuardForcedDescr(metainterp_sd,
self.jitdriver_sd)
elif opnum == rop.GUARD_NOT_INVALIDATED:
@@ -2281,7 +2281,7 @@
self.history.record(rop.FORCE_TOKEN, [], force_token_box)
self.history.record(rop.SETFIELD_GC, [vbox, force_token_box],
None, descr=vinfo.vable_token_descr)
- self.generate_guard(rop.GUARD_NOT_FORCED, None)
+ self.generate_guard(rop.GUARD_NOT_FORCED_2, None)
def compile_exit_frame_with_exception(self, valuebox):
self.store_token_in_vable()
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
@@ -395,6 +395,7 @@
'GUARD_NO_OVERFLOW/0d',
'GUARD_OVERFLOW/0d',
'GUARD_NOT_FORCED/0d', # may be called with an exception currently set
+ 'GUARD_NOT_FORCED_2/0d', # same as GUARD_NOT_FORCED, but for finish()
'GUARD_NOT_INVALIDATED/0d',
'_GUARD_LAST', # ----- end of guard operations -----
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit