diff options
author | Richard Henderson <rth@redhat.com> | 2014-11-19 05:30:59 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2014-11-19 05:30:59 -0800 |
commit | f2d3d07ee55fa52b41c1ec08e51269831961a772 (patch) | |
tree | 7cca5afeed122318032b1af7171e8154c14590df /gcc/gimple-fold.c | |
parent | c21df29bcfc04945d3a7be6a0c6e306fc9efc505 (diff) | |
download | gcc-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.c | 21 |
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; |