Author: Maciej Fijalkowski <fij...@gmail.com> Branch: share-guard-info Changeset: r79608:986e925ea183 Date: 2015-09-13 17:12 +0200 http://bitbucket.org/pypy/pypy/changeset/986e925ea183/
Log: whack a bit until we can share more diff --git a/rpython/jit/codewriter/flatten.py b/rpython/jit/codewriter/flatten.py --- a/rpython/jit/codewriter/flatten.py +++ b/rpython/jit/codewriter/flatten.py @@ -216,24 +216,21 @@ if linkfalse.llexitcase == True: linkfalse, linktrue = linktrue, linkfalse opname = 'goto_if_not' - livebefore = False if isinstance(block.exitswitch, tuple): # special case produced by jtransform.optimize_goto_if_not() opname = 'goto_if_not_' + block.exitswitch[0] opargs = block.exitswitch[1:] if opargs[-1] == '-live-before': - livebefore = True opargs = opargs[:-1] else: assert block.exitswitch.concretetype == lltype.Bool opargs = [block.exitswitch] # lst = self.flatten_list(opargs) + [TLabel(linkfalse)] - if livebefore: - self.emitline('-live-') + self.emitline('-live-') self.emitline(opname, *lst) - if not livebefore: - self.emitline('-live-', TLabel(linkfalse)) + #if not livebefore: + # self.emitline('-live-', TLabel(linkfalse)) # true path: self.make_link(linktrue) # false path: diff --git a/rpython/jit/codewriter/jtransform.py b/rpython/jit/codewriter/jtransform.py --- a/rpython/jit/codewriter/jtransform.py +++ b/rpython/jit/codewriter/jtransform.py @@ -211,8 +211,8 @@ # ok! optimize this case block.operations.remove(op) block.exitswitch = (op.opname,) + tuple(op.args) - if op.opname in ('ptr_iszero', 'ptr_nonzero'): - block.exitswitch += ('-live-before',) + #if op.opname in ('ptr_iszero', 'ptr_nonzero'): + block.exitswitch += ('-live-before',) # if the variable escape to the next block along a link, # replace it with a constant, because we know its value for link in block.exits: diff --git a/rpython/jit/metainterp/blackhole.py b/rpython/jit/metainterp/blackhole.py --- a/rpython/jit/metainterp/blackhole.py +++ b/rpython/jit/metainterp/blackhole.py @@ -1473,7 +1473,7 @@ elif opnum == rop.GUARD_TRUE: # Produced directly by some goto_if_not_xxx() opcode that did not # jump, but which must now jump. The pc is just after the opcode. - self.position = self.jitcode.follow_jump(self.position) + pass # self.position = self.jitcode.follow_jump(self.position) # elif opnum == rop.GUARD_FALSE: # Produced directly by some goto_if_not_xxx() opcode that jumped, 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 @@ -599,6 +599,8 @@ descr.copy_all_attributes_from(last_guard_op.getdescr()) guard_op.setdescr(descr) guard_op.setfailargs(last_guard_op.getfailargs()) + if guard_op.getopnum() == rop.GUARD_VALUE: + guard_op = self._maybe_replace_guard_value(guard_op, descr) return guard_op def getlastop(self): @@ -641,24 +643,28 @@ descr.store_final_boxes(op, newboxes, self.metainterp_sd) # if op.getopnum() == rop.GUARD_VALUE: - if op.getarg(0).type == 'i': - b = self.getintbound(op.getarg(0)) - if b.is_bool(): - # Hack: turn guard_value(bool) into guard_true/guard_false. - # This is done after the operation is emitted to let - # store_final_boxes_in_guard set the guard_opnum field of - # the descr to the original rop.GUARD_VALUE. - constvalue = op.getarg(1).getint() - if constvalue == 0: - opnum = rop.GUARD_FALSE - elif constvalue == 1: - opnum = rop.GUARD_TRUE - else: - raise AssertionError("uh?") - newop = self.replace_op_with(op, opnum, [op.getarg(0)], descr) - return newop - # a real GUARD_VALUE. Make it use one counter per value. - descr.make_a_counter_per_value(op) + op = self._maybe_replace_guard_value(op, descr) + return op + + def _maybe_replace_guard_value(self, op, descr): + if op.getarg(0).type == 'i': + b = self.getintbound(op.getarg(0)) + if b.is_bool(): + # Hack: turn guard_value(bool) into guard_true/guard_false. + # This is done after the operation is emitted to let + # store_final_boxes_in_guard set the guard_opnum field of + # the descr to the original rop.GUARD_VALUE. + constvalue = op.getarg(1).getint() + if constvalue == 0: + opnum = rop.GUARD_FALSE + elif constvalue == 1: + opnum = rop.GUARD_TRUE + else: + raise AssertionError("uh?") + newop = self.replace_op_with(op, opnum, [op.getarg(0)], descr) + return newop + # a real GUARD_VALUE. Make it use one counter per value. + descr.make_a_counter_per_value(op) return op def optimize_default(self, op): 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 @@ -329,37 +329,37 @@ def opimpl_goto(self, target): self.pc = target - @arguments("box", "label") - def opimpl_goto_if_not(self, box, target): + @arguments("box", "label", "orgpc") + def opimpl_goto_if_not(self, box, target, orgpc): switchcase = box.getint() if switchcase: opnum = rop.GUARD_TRUE else: opnum = rop.GUARD_FALSE - self.metainterp.generate_guard(opnum, box) + self.metainterp.generate_guard(opnum, box, resumepc=orgpc) if not switchcase: self.pc = target - @arguments("box", "label") - def opimpl_goto_if_not_int_is_true(self, box, target): + @arguments("box", "label", "orgpc") + def opimpl_goto_if_not_int_is_true(self, box, target, orgpc): condbox = self.execute(rop.INT_IS_TRUE, box) - self.opimpl_goto_if_not(condbox, target) + self.opimpl_goto_if_not(condbox, target, orgpc) - @arguments("box", "label") - def opimpl_goto_if_not_int_is_zero(self, box, target): + @arguments("box", "label", "orgpc") + def opimpl_goto_if_not_int_is_zero(self, box, target, orgpc): condbox = self.execute(rop.INT_IS_ZERO, box) - self.opimpl_goto_if_not(condbox, target) + self.opimpl_goto_if_not(condbox, target, orgpc) for _opimpl in ['int_lt', 'int_le', 'int_eq', 'int_ne', 'int_gt', 'int_ge', 'ptr_eq', 'ptr_ne']: exec py.code.Source(''' - @arguments("box", "box", "label") - def opimpl_goto_if_not_%s(self, b1, b2, target): + @arguments("box", "box", "label", "orgpc") + def opimpl_goto_if_not_%s(self, b1, b2, target, orgpc): if b1 is b2: condbox = %s else: condbox = self.execute(rop.%s, b1, b2) - self.opimpl_goto_if_not(condbox, target) + self.opimpl_goto_if_not(condbox, target, orgpc) ''' % (_opimpl, FASTPATHS_SAME_BOXES[_opimpl.split("_")[-1]], _opimpl.upper()) ).compile() @@ -2456,7 +2456,7 @@ if opnum == rop.GUARD_FUTURE_CONDITION: pass elif opnum == rop.GUARD_TRUE: # a goto_if_not that jumps only now - frame.pc = frame.jitcode.follow_jump(frame.pc) + pass # frame.pc = frame.jitcode.follow_jump(frame.pc) elif opnum == rop.GUARD_FALSE: # a goto_if_not that stops jumping; pass # or a switch that was in its "default" case elif opnum == rop.GUARD_VALUE or opnum == rop.GUARD_CLASS: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit