Add EAF_NODIRECTESCAPE flag
authorJan Hubicka <jh@suse.cz>
Wed, 25 Nov 2020 19:51:26 +0000 (20:51 +0100)
committerJan Hubicka <jh@suse.cz>
Wed, 25 Nov 2020 19:51:26 +0000 (20:51 +0100)
commitbb07490abba850fd5b1d2d09d76d18b8bdc7d817
tree088a7d9ff0a070269412fd9c22a3ce3861066442
parent5962efe9186559ada404ac8f9f56006648a5858e
Add EAF_NODIRECTESCAPE flag

Main limitation of modref is the fact that it does not
track anything in memory. This is intentional - I wanted the initial
implementation to be cheap. However it also makes it very limited when it comes
to detecting noescape especially because it is paranoid about what memory
accesses may be used to copy (bits of) pointers.

This patch adds EAF_NODIRECTSCAPE that is weaker vairant of EAF_NOESCAPE where
we only know that the pointer itself does not escape, but memory pointed to
may.  This is a lot more reliable to auto-detect that EAF_NOESCAPE and still
enables additional optimization.  With patch we get nodirectscape flag for b
that enables in practice similar optimization as EAF_NOESCAPE for arrays of
integers that points nowhere :)

gcc/ChangeLog:
* gimple.c (gimple_call_arg_flags): Also imply EAF_NODIRECTESCAPE.
* tree-core.h (EAF_NODRECTESCAPE): New flag.
* tree-ssa-structalias.c (make_indirect_escape_constraint): New
function.
(handle_rhs_call): Hanlde EAF_NODIRECTESCAPE.
* ipa-modref.c (dump_eaf_flags): Print EAF_NODIRECTESCAPE.
(deref_flags): Dereference is always EAF_NODIRECTESCAPE.
(modref_lattice::init): Also set EAF_NODIRECTESCAPE.
(analyze_ssa_name_flags): Pure functions do not affect
EAF_NODIRECTESCAPE.
(analyze_params): Likewise.
(ipa_merge_modref_summary_after_inlining): Likewise.
(modref_merge_call_site_flags): Likewise.
gcc/gimple.c
gcc/ipa-modref.c
gcc/tree-core.h
gcc/tree-ssa-structalias.c