On Fri, 2014-09-05 at 12:45 -0600, Jeff Law wrote: > On 09/04/14 14:04, David Malcolm wrote: > > On Tue, 2014-09-02 at 19:50 +0200, Andi Kleen wrote: > >>> I suspect the bulk of them currently are coming from the safe_as_a > >>> <rtx_insn *> calls within NEXT_INSN and PREV_INSN; do you happen to have > >>> information handy on that? > >> > >> Yes that's right: > >> > >> - 1.03% lto1 [.] bool > >> is_a_helper<rtx_insn*>::test<rtx_def>(rtx_def*) > >> ▒ > >> - bool is_a_helper<rtx_insn*>::test<rtx_def>(rtx_def*) > >> ▒ > >> - 92.20% bool is_a<rtx_insn*, rtx_def>(rtx_def*) > >> ▒ > >> - 98.53% rtx_insn* safe_as_a<rtx_insn*, rtx_def>(rtx_def*) > >> ▒ > >> - 73.28% NEXT_INSN(rtx_insn const*) > >> ▒ > > > > The is_a_helper for rtx_insn * is non-trivial, so it may be worth > > avoiding it, even when inlined. > > > > The attached patch rewrites the inline NEXT_INSN/PREV_INSN to avoid > > doing the safe_as_a, instead tightening up the interface so that one can > > only set them to an insn, and introducing a new XINSN access macro and > > corresponding rt_insn member of the union. > > > > Bootstrapped on x86_64-unknown-linux-gnu (Fedora 20), and has been > > rebuilt as part of a config-list.mk build for all working configurations > > (albeit with other patches for the latter case). > > > > OK for trunk? > So is this just to deal with the overhead in the safe_as_a helper until > we can strengthen more code? And is that overhead significant in an > optimized build? > > Would an alternate approach be to make the checking in safe_as_a > conditionalized on ENABLE_CHECKING?
I wrote the attached patch to do that, but I don't yet have numbers to back it up. Bootstrapped with current settings, and smoketested with --enable-checking=release (both on Fedora 20 x86_64).
>From 24b98616c4425a8ef380d2d5fef00f82af9df985 Mon Sep 17 00:00:00 2001 From: David Malcolm <dmalc...@redhat.com> Date: Fri, 29 Aug 2014 17:04:49 -0400 Subject: [PATCH] Ensure that safe_as_a can have no performance overhead in a release build gcc/ * is-a.h (safe_as_a): Eliminate the conditional from the !defined(ENABLE_CHECKING) case, to ensure there can be no performance degradation of the release build. --- gcc/is-a.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gcc/is-a.h b/gcc/is-a.h index 176066b..f0c05b0 100644 --- a/gcc/is-a.h +++ b/gcc/is-a.h @@ -200,6 +200,7 @@ template <typename T, typename U> inline T safe_as_a (U *p) { +#ifdef ENABLE_CHECKING if (p) { gcc_checking_assert (is_a <T> (p)); @@ -207,6 +208,9 @@ safe_as_a (U *p) } else return NULL; +#else + return is_a_helper <T>::cast (p); +#endif } /* A generic checked conversion from a base type U to a derived type T. See -- 1.8.5.3