diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-04-18 11:59:34 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-04-18 11:59:34 +0000 |
commit | 6fec5449ffb1eab7e0304f988ce6c85d83ade73b (patch) | |
tree | ed06be32d0f633307c932b9633f8c7ecf01cec59 /gcc/tree-ssa-pre.c | |
parent | 52f6cc19df24a2deda0b973746f05bce6453961a (diff) | |
download | gcc-6fec5449ffb1eab7e0304f988ce6c85d83ade73b.tar.gz |
2011-04-18 Richard Guenther <rguenther@suse.de>
* gimple.h (gimple_call_addr_fndecl): New function.
(gimple_call_fndecl): Use it.
* gimple-fold.c (gimple_fold_call): Fold away OBJ_TYPE_REFs
for direct calls.
* tree-ssa-ccp.c (ccp_fold_stmt): Remove OBJ_TYPE_REF folding.
* tree-ssa-pre.c (eliminate): Also simplify indirect OBJ_TYPE_REFs.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@172644 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r-- | gcc/tree-ssa-pre.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index e59a598348b..df2a13867d1 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -4380,13 +4380,18 @@ eliminate (void) } /* Visit indirect calls and turn them into direct calls if possible. */ - if (is_gimple_call (stmt) - && TREE_CODE (gimple_call_fn (stmt)) == SSA_NAME) + if (is_gimple_call (stmt)) { tree orig_fn = gimple_call_fn (stmt); - tree fn = VN_INFO (orig_fn)->valnum; - if (TREE_CODE (fn) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND (fn, 0)) == FUNCTION_DECL + tree fn; + if (TREE_CODE (orig_fn) == SSA_NAME) + fn = VN_INFO (orig_fn)->valnum; + else if (TREE_CODE (orig_fn) == OBJ_TYPE_REF + && TREE_CODE (OBJ_TYPE_REF_EXPR (orig_fn)) == SSA_NAME) + fn = VN_INFO (OBJ_TYPE_REF_EXPR (orig_fn))->valnum; + else + continue; + if (gimple_call_addr_fndecl (fn) != NULL_TREE && useless_type_conversion_p (TREE_TYPE (orig_fn), TREE_TYPE (fn))) { |