Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r75242:cd4b0dd3d1e3 Date: 2015-01-05 13:43 +0100 http://bitbucket.org/pypy/pypy/changeset/cd4b0dd3d1e3/
Log: Fix. Obscure case causing endless troubles. See irc discussion. 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 @@ -269,9 +269,8 @@ op = ResOperation(rop.GUARD_VALUE, [box, self.box], None) guards.append(op) elif level == LEVEL_KNOWNCLASS: - op = ResOperation(rop.GUARD_NONNULL, [box], None) - guards.append(op) - op = ResOperation(rop.GUARD_CLASS, [box, self.known_class], None) + op = ResOperation(rop.GUARD_NONNULL_CLASS, + [box, self.known_class], None) guards.append(op) else: if level == LEVEL_NONNULL: diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py --- a/rpython/jit/metainterp/optimizeopt/rewrite.py +++ b/rpython/jit/metainterp/optimizeopt/rewrite.py @@ -297,7 +297,8 @@ name = "<unknown>" raise InvalidLoop('A promote of a virtual %s (a recently allocated object) never makes sense!' % name) old_guard_op = value.get_last_guard(self.optimizer) - if old_guard_op: + if old_guard_op and not isinstance(old_guard_op.getdescr(), + compile.ResumeAtPositionDescr): # there already has been a guard_nonnull or guard_class or # guard_nonnull_class on this value, which is rather silly. # replace the original guard with a guard_value @@ -316,6 +317,11 @@ op = old_guard_op.copy_and_change(rop.GUARD_VALUE, args = [old_guard_op.getarg(0), op.getarg(1)], descr = descr) + # Note: we give explicitly a new descr for 'op'; this is why the + # old descr must not be ResumeAtPositionDescr (checked above). + # Better-safe-than-sorry but it should never occur: we should + # not put in short preambles guard_xxx and guard_value + # on the same box. self.optimizer.replace_guard(op, value) descr.make_a_counter_per_value(op) # to be safe @@ -354,7 +360,8 @@ % r) assert isinstance(value, PtrOptValue) old_guard_op = value.get_last_guard(self.optimizer) - if old_guard_op: + if old_guard_op and not isinstance(old_guard_op.getdescr(), + compile.ResumeAtPositionDescr): # there already has been a guard_nonnull or guard_class or # guard_nonnull_class on this value. if old_guard_op.getopnum() == rop.GUARD_NONNULL: @@ -364,6 +371,11 @@ op = old_guard_op.copy_and_change (rop.GUARD_NONNULL_CLASS, args = [old_guard_op.getarg(0), op.getarg(1)], descr=descr) + # Note: we give explicitly a new descr for 'op'; this is why the + # old descr must not be ResumeAtPositionDescr (checked above). + # Better-safe-than-sorry but it should never occur: we should + # not put in short preambles guard_nonnull and guard_class + # on the same box. self.optimizer.replace_guard(op, value) # not emitting the guard, so we have to pass None to # make_constant_class, so last_guard_pos is not updated diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py --- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py @@ -7255,11 +7255,9 @@ short = """ [p0] p1 = getfield_gc(p0, descr=nextdescr) - guard_nonnull(p1) [] - guard_class(p1, ConstClass(node_vtable)) [] + guard_nonnull_class(p1, ConstClass(node_vtable)) [] p2 = getfield_gc(p1, descr=nextdescr) - guard_nonnull(p2) [] - guard_class(p2, ConstClass(node_vtable)) [] + guard_nonnull_class(p2, ConstClass(node_vtable)) [] jump(p0) """ self.optimize_loop(ops, expected, expected_short=short) diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py --- a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py @@ -402,8 +402,7 @@ guards = value1.make_guards(box) expected = """ [p0] - guard_nonnull(p0) [] - guard_class(p0, ConstClass(node_vtable)) [] + guard_nonnull_class(p0, ConstClass(node_vtable)) [] """ self.compare(guards, expected, [box]) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit