summaryrefslogtreecommitdiff
path: root/gcc/gimple.c
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2014-11-14 17:46:50 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2014-11-14 17:46:50 +0000
commit04c849b31c5935979173f0b33f6a92506324ddd5 (patch)
treea5f3f2ac60cf67edecc73331df1bbb55654423a3 /gcc/gimple.c
parentf407b74ad3650ad40b2fb3d1751f362d5b81b8ae (diff)
downloadgcc-04c849b31c5935979173f0b33f6a92506324ddd5.tar.gz
* ipa-pure-const.c (struct funct_state_d): Add can_free field.
(varying_state): Add true for can_free. (check_call): For builtin or internal !nonfreeing_call_p set local->can_free. (check_stmt): For asm volatile and asm with "memory" set local->can_free. (analyze_function): Clear local->can_free initially, continue calling check_stmt until all flags are computed, dump can_free flag. (pure_const_write_summary): Write can_free flag. (pure_const_read_summary): Read it back. (propagate_pure_const): Propagate also can_free flag, set w->nonfreeing_fn if it is false after propagation. * cgraph.h (cgraph_node): Add nonfreeing_fn member. * gimple.c: Include ipa-ref.h, lto-streamer.h and cgraph.h. (nonfreeing_call_p): Return cgraph nonfreeing_fn flag if set. Also return true for IFN_ABNORMAL_DISPATCHER. * cgraph.c (cgraph_node::dump): Dump nonfreeing_fn flag. * lto-cgraph.c (lto_output_node): Write nonfreeing_fn flag. (input_overwrite_node): Read it back. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@217582 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gimple.c')
-rw-r--r--gcc/gimple.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/gcc/gimple.c b/gcc/gimple.c
index ac753650e18..f8459a448cb 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -58,6 +58,9 @@ along with GCC; see the file COPYING3. If not see
#include "bitmap.h"
#include "stringpool.h"
#include "tree-ssanames.h"
+#include "ipa-ref.h"
+#include "lto-streamer.h"
+#include "cgraph.h"
/* All the tuples have their operand vector (if present) at the very bottom
@@ -2538,11 +2541,28 @@ nonfreeing_call_p (gimple call)
default:
return true;
}
- else if (gimple_call_internal_p (call)
- && gimple_call_flags (call) & ECF_LEAF)
- return true;
+ else if (gimple_call_internal_p (call))
+ switch (gimple_call_internal_fn (call))
+ {
+ case IFN_ABNORMAL_DISPATCHER:
+ return true;
+ default:
+ if (gimple_call_flags (call) & ECF_LEAF)
+ return true;
+ return false;
+ }
- return false;
+ tree fndecl = gimple_call_fndecl (call);
+ if (!fndecl)
+ return false;
+ struct cgraph_node *n = cgraph_node::get (fndecl);
+ if (!n)
+ return false;
+ enum availability availability;
+ n = n->function_symbol (&availability);
+ if (!n || availability <= AVAIL_INTERPOSABLE)
+ return false;
+ return n->nonfreeing_fn;
}
/* Callback for walk_stmt_load_store_ops.