On Tue, May 20, 2014 at 1:04 PM, Jan Hubicka <hubi...@ucw.cz> wrote:
> Hi,
> as disucssed some time ago, our assumption that every symbol of shared 
> library can
> be interposed at runtime is expensive and prevents a lot of useful 
> optimizations,
> including inlining or IPA propagation.
>
> While this is useful feature, it is rather incommon to use it for bigger C++
> projects, like firefox and at least clang seems to ignore the ELF 
> interposition
> rules and always inline/propagate. This patch adds flag to control the 
> behaviour.
> Symbols explicitly delcared WEAK are still considered as interposable.
>
> Bootstrapped/regtested x86_64-linux, will commit it tomorrow if there are
> no complains. (Feedback is welcome!)


Did this patch ever go in?  I am running in a case where I would like
to use this option to improve some C++ library speed.

Thanks,
Andrew

>
> Honza
>
>         * doc/invoke.texi (-fsemantic-interposition): New flag.
>         * common.opt (fsemantic-interposition): Use it.
>         * varasm.c (decl_replaceable_p): Use it.
> Index: doc/invoke.texi
> ===================================================================
> --- doc/invoke.texi     (revision 210653)
> +++ doc/invoke.texi     (working copy)
> @@ -411,6 +411,7 @@ Objective-C and Objective-C++ Dialects}.
>  -fschedule-insns -fschedule-insns2 -fsection-anchors @gol
>  -fselective-scheduling -fselective-scheduling2 @gol
>  -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops @gol
> +-fsemantic-interposition @gol
>  -fshrink-wrap -fsignaling-nans -fsingle-precision-constant @gol
>  -fsplit-ivs-in-unroller -fsplit-wide-types -fstack-protector @gol
>  -fstack-protector-all -fstack-protector-strong -fstrict-aliasing @gol
> @@ -7709,6 +7710,22 @@ This option has no effect unless one of
>  When pipelining loops during selective scheduling, also pipeline outer loops.
>  This option has no effect unless @option{-fsel-sched-pipelining} is turned 
> on.
>
> +@item -fsemantic-interposition
> +@opindex fsemantic-interposition
> +Some object formats, like ELF, allow interposing of symbols by dynamic 
> linker.
> +This means that for symbols exported from the DSO compiler can not perform
> +inter-procedural propagation, inlining and other optimizations in 
> anticipation
> +that the function or variable in question may change. While this feature is
> +useful, for example, to rewrite memory allocation functions by a debugging
> +implementation, it is expensive in the terms of code quality.
> +With @option{-fno-semantic-inteposition} compiler assumest that if 
> interposition
> +happens for functions the overwritting function will have
> +precisely same semantics (and side effects). Similarly if interposition 
> happens
> +for variables, the constructor of the variable will be the same. The flag
> +has no effect for functions explicitly declared inline, where
> +interposition changing semantic is never allowed and for symbols explicitly
> +declared weak.
> +
>  @item -fshrink-wrap
>  @opindex fshrink-wrap
>  Emit function prologues only before parts of the function that need it,
> Index: common.opt
> ===================================================================
> --- common.opt  (revision 210653)
> +++ common.opt  (working copy)
> @@ -1854,6 +1854,10 @@ fsel-sched-reschedule-pipelined
>  Common Report Var(flag_sel_sched_reschedule_pipelined) Init(0) Optimization
>  Reschedule pipelined regions without pipelining
>
> +fsemantic-interposition
> +Common Report Var(flag_semantic_interposition) Init(1)
> +Allow interposing function (or variables) by ones with different semantics 
> (or initializer) respectively by dynamic linker
> +
>  ; sched_stalled_insns means that insns can be moved prematurely from the 
> queue
>  ; of stalled insns into the ready list.
>  fsched-stalled-insns
> Index: varasm.c
> ===================================================================
> --- varasm.c    (revision 210654)
> +++ varasm.c    (working copy)
> @@ -6870,6 +6870,9 @@ decl_replaceable_p (tree decl)
>    gcc_assert (DECL_P (decl));
>    if (!TREE_PUBLIC (decl) || DECL_COMDAT (decl))
>      return false;
> +  if (!flag_semantic_interposition
> +      && !DECL_WEAK (decl))
> +    return false;
>    return !decl_binds_to_current_def_p (decl);
>  }
>

Reply via email to