aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-fold.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2014-11-19 05:30:59 -0800
committerRichard Henderson <rth@gcc.gnu.org>2014-11-19 05:30:59 -0800
commitf2d3d07ee55fa52b41c1ec08e51269831961a772 (patch)
tree7cca5afeed122318032b1af7171e8154c14590df /gcc/gimple-fold.c
parentc21df29bcfc04945d3a7be6a0c6e306fc9efc505 (diff)
downloadgcc-f2d3d07ee55fa52b41c1ec08e51269831961a772.zip
gcc-f2d3d07ee55fa52b41c1ec08e51269831961a772.tar.gz
gcc-f2d3d07ee55fa52b41c1ec08e51269831961a772.tar.bz2
Allow the front-end to create calls with a static chain
And, at the same time, allow indirect calls to have a static chain. We'll always eliminate the static chain if we can prove it's unused. * calls.c (prepare_call_address): Allow decl or type for first arg. (expand_call): Pass type to prepare_call_address if no decl. * gimple-fold.c (gimple_fold_call): Eliminate the static chain if the function doesn't use it; fold it otherwise. * gimplify.c (gimplify_call_expr): Gimplify the static chain. * tree-cfg.c (verify_gimple_call): Allow a static chain on indirect function calls. From-SVN: r217770
Diffstat (limited to 'gcc/gimple-fold.c')
-rw-r--r--gcc/gimple-fold.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index acdadcd..4f716b2 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -2723,6 +2723,27 @@ gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace)
}
}
+ /* Check for indirect calls that became direct calls, and then
+ no longer require a static chain. */
+ if (gimple_call_chain (stmt))
+ {
+ tree fn = gimple_call_fndecl (stmt);
+ if (fn && !DECL_STATIC_CHAIN (fn))
+ {
+ gimple_call_set_chain (stmt, NULL);
+ changed = true;
+ }
+ else
+ {
+ tree tmp = maybe_fold_reference (gimple_call_chain (stmt), false);
+ if (tmp)
+ {
+ gimple_call_set_chain (stmt, tmp);
+ changed = true;
+ }
+ }
+ }
+
if (inplace)
return changed;