Hi,

When IPA-SRA removes an SSA_NAME from a LHS of a call statement
because it is not necessary, it does not release it.  This patch fixes
that.

Bootstrapped and tested on x86_64, at some point I'll LTO-bootstrap it
too.  I assume this is GCC 12 material, so OK once stage 1 opens?

Thanks,

Martin


gcc/ChangeLog:

2021-04-08  Martin Jambor  <mjam...@suse.cz>

        PR ipa/99951
        * ipa-param-manipulation.c (ipa_param_adjustments::modify_call):
        If removing a call statement LHS SSA name, release it.
---
 gcc/ipa-param-manipulation.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/gcc/ipa-param-manipulation.c b/gcc/ipa-param-manipulation.c
index 132bb24f76a..1d1e64f546a 100644
--- a/gcc/ipa-param-manipulation.c
+++ b/gcc/ipa-param-manipulation.c
@@ -856,6 +856,7 @@ ipa_param_adjustments::modify_call (gcall *stmt,
 
   gcall *new_stmt = gimple_build_call_vec (callee_decl, vargs);
 
+  tree ssa_to_remove = NULL;
   if (tree lhs = gimple_call_lhs (stmt))
     {
       if (!m_skip_return)
@@ -880,6 +881,7 @@ ipa_param_adjustments::modify_call (gcall *stmt,
                }
              update_stmt (using_stmt);
            }
+         ssa_to_remove = lhs;
        }
     }
 
@@ -898,6 +900,8 @@ ipa_param_adjustments::modify_call (gcall *stmt,
       fprintf (dump_file, "\n");
     }
   gsi_replace (&gsi, new_stmt, true);
+  if (ssa_to_remove)
+    release_ssa_name (ssa_to_remove);
   if (update_references)
     do
       {
-- 
2.30.2

Reply via email to