aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2020-11-25 20:51:26 +0100
committerJan Hubicka <jh@suse.cz>2020-11-25 20:51:26 +0100
commitbb07490abba850fd5b1d2d09d76d18b8bdc7d817 (patch)
tree088a7d9ff0a070269412fd9c22a3ce3861066442 /gcc/gimple.c
parent5962efe9186559ada404ac8f9f56006648a5858e (diff)
downloadgcc-bb07490abba850fd5b1d2d09d76d18b8bdc7d817.zip
gcc-bb07490abba850fd5b1d2d09d76d18b8bdc7d817.tar.gz
gcc-bb07490abba850fd5b1d2d09d76d18b8bdc7d817.tar.bz2
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.
Diffstat (limited to 'gcc/gimple.c')
-rw-r--r--gcc/gimple.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/gcc/gimple.c b/gcc/gimple.c
index e3e508d..e8246b7 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -1543,7 +1543,7 @@ gimple_call_arg_flags (const gcall *stmt, unsigned arg)
if (fnspec.arg_direct_p (arg))
flags |= EAF_DIRECT;
if (fnspec.arg_noescape_p (arg))
- flags |= EAF_NOESCAPE;
+ flags |= EAF_NOESCAPE | EAF_NODIRECTESCAPE;
if (fnspec.arg_readonly_p (arg))
flags |= EAF_NOCLOBBER;
}