diff options
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 acdadcd8827..4f716b2e0e0 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; |