Author: Carl Friedrich Bolz-Tereick <cfb...@gmx.de> Branch: Changeset: r92317:e66be45f3914 Date: 2017-09-05 16:33 +0200 http://bitbucket.org/pypy/pypy/changeset/e66be45f3914/
Log: emit guard_nonnull_class in the short preamble, instead of two guards in case of remove_gctypeptr = True 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 @@ -329,11 +329,14 @@ def make_guards(self, op, short, optimizer): if self._known_class is not None: - short.append(ResOperation(rop.GUARD_NONNULL, [op])) if not optimizer.cpu.remove_gctypeptr: + short.append(ResOperation(rop.GUARD_NONNULL, [op])) short.append(ResOperation(rop.GUARD_IS_OBJECT, [op])) - short.append(ResOperation(rop.GUARD_CLASS, - [op, self._known_class])) + short.append(ResOperation(rop.GUARD_CLASS, + [op, self._known_class])) + else: + short.append(ResOperation(rop.GUARD_NONNULL_CLASS, + [op, self._known_class])) elif self.descr is not None: short.append(ResOperation(rop.GUARD_NONNULL, [op])) if not optimizer.cpu.remove_gctypeptr: 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 @@ -7541,6 +7541,33 @@ """ self.optimize_loop(ops, expected, expected_short=short) + def test_guards_before_getfields_in_short_preamble_removetypeptr(self, monkeypatch): + monkeypatch.setattr(self.cpu, "remove_gctypeptr", True) + ops = """ + [p0] + guard_nonnull_class(p0, ConstClass(node_vtable)) [] + p1 = getfield_gc_r(p0, descr=nextdescr) + guard_nonnull_class(p1, ConstClass(node_vtable)) [] + p2 = getfield_gc_r(p1, descr=nextdescr) + guard_nonnull_class(p2, ConstClass(node_vtable)) [] + jump(p0) + """ + expected = """ + [p0, p1] + jump(p0, p1) + """ + short = """ + [p0] + guard_nonnull_class(p0, ConstClass(node_vtable)) [] + p1 = getfield_gc_r(p0, descr=nextdescr) + guard_nonnull_class(p1, ConstClass(node_vtable)) [] + p2 = getfield_gc_r(p1, descr=nextdescr) + guard_nonnull_class(p2, ConstClass(node_vtable)) [] + jump(p1) + """ + self.optimize_loop(ops, expected, expected_short=short) + + def test_forced_virtual_pure_getfield(self): ops = """ [p0] _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit