]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/67794 (internal compiler error: Segmentation fault)
authorMartin Jambor <mjambor@suse.cz>
Mon, 2 Nov 2015 14:04:19 +0000 (15:04 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Mon, 2 Nov 2015 14:04:19 +0000 (15:04 +0100)
2015-11-02  Martin Jambor  <mjambor@suse.cz>

PR tree-optimization/67794
* tree-sra.c (replace_removed_params_ssa_names): Do not distinguish
between types of statements but accept original definitions as a
parameter.
  (ipa_sra_modify_function_body): Use FOR_EACH_SSA_DEF_OPERAND to
  iterate over definitions.

testsuite/
  * gcc.dg/ipa/ipa-sra-10.c: New test.
  * gcc.dg/torture/pr67794.c: Likewise.

From-SVN: r229666

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/ipa/ipa-sra-10.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr67794.c [new file with mode: 0644]
gcc/tree-sra.c

index c61d95fe0ffb50ae5f4f576088091640225d860a..b00b1657e02c6fc9915cc99679bca06764f062d2 100644 (file)
@@ -1,3 +1,15 @@
+2015-11-02  Martin Jambor  <mjambor@suse.cz>
+
+       Backport from mainline
+       2015-10-09  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/67794
+       * tree-sra.c (replace_removed_params_ssa_names): Do not distinguish
+       between types of statements but accept original definitions as a
+       parameter.
+       (ipa_sra_modify_function_body): Use FOR_EACH_SSA_DEF_OPERAND to
+       iterate over definitions.
+
 2015-10-27  Caroline Tice  <cmtice@google.com>
 
        (from Richard Biener)
index 60f6cd36cbbb65f6d910a4be939ca0a84a0252fc..8540fb6ff9a936a30102c59f23a4117e4ce61a0d 100644 (file)
@@ -1,3 +1,11 @@
+2015-11-02  Martin Jambor  <mjambor@suse.cz>
+
+       Backport from mainline
+       2015-10-09  Martin Jambor  <mjambor@suse.cz>
+
+       * gcc.dg/ipa/ipa-sra-10.c: New test.
+       * gcc.dg/torture/pr67794.c: Likewise.
+
 2015-10-22  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/58754
diff --git a/gcc/testsuite/gcc.dg/ipa/ipa-sra-10.c b/gcc/testsuite/gcc.dg/ipa/ipa-sra-10.c
new file mode 100644 (file)
index 0000000..24b64d1
--- /dev/null
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fipa-sra -fdump-tree-eipa_sra-details"  } */
+
+extern void consume (int);
+extern int glob, glob1, glob2;
+extern int get (void);
+
+
+static void __attribute__ ((noinline))
+foo (int a)
+{
+  a = glob;
+  consume (a);
+  a = get ();
+  consume (a);
+  __asm__ volatile("" : : ""(a));
+  consume (a);
+
+  if (glob1)
+    a = glob1;
+  else
+    a = glob2;
+  consume (a);
+}
+
+int
+bar (int a)
+{
+  foo (a);
+  glob = a;
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "replacing an SSA name of a removed param" 4 "eipa_sra" } } */
diff --git a/gcc/testsuite/gcc.dg/torture/pr67794.c b/gcc/testsuite/gcc.dg/torture/pr67794.c
new file mode 100644 (file)
index 0000000..5489e56
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+
+int *b;
+static void fn1(int *best, int *dmin) {
+  int a[64];
+  dmin = a;
+  __asm__ volatile("" : "+&r"(dmin) : ""(best));
+}
+
+__attribute__((always_inline)) static inline void fn2(int *best) { fn1(best, b); }
+
+void fn3(void) {
+  int c[1];
+  fn2(c);
+}
index 13f6c4a8e63d3bd174ec477d58b4389f00875562..4f9e80629676f40309ab60f9646bb261c6eb1386 100644 (file)
@@ -4464,61 +4464,45 @@ get_adjustment_for_base (ipa_parm_adjustment_vec adjustments, tree base)
   return NULL;
 }
 
-/* If the statement STMT defines an SSA_NAME of a parameter which is to be
-   removed because its value is not used, replace the SSA_NAME with a one
-   relating to a created VAR_DECL together all of its uses and return true.
-   ADJUSTMENTS is a pointer to an adjustments vector.  */
+/* If OLD_NAME, which is being defined by statement STMT, is an SSA_NAME of a
+   parameter which is to be removed because its value is not used, create a new
+   SSA_NAME relating to a replacement VAR_DECL, replace all uses of the
+   original with it and return it.  If there is no need to re-map, return NULL.
+   ADJUSTMENTS is a pointer to a vector of IPA-SRA adjustments.  */
 
-static bool
-replace_removed_params_ssa_names (gimple stmt,
+static tree
+replace_removed_params_ssa_names (tree old_name, gimple stmt,
                                  ipa_parm_adjustment_vec adjustments)
 {
   struct ipa_parm_adjustment *adj;
-  tree lhs, decl, repl, name;
-
-  if (gimple_code (stmt) == GIMPLE_PHI)
-    lhs = gimple_phi_result (stmt);
-  else if (is_gimple_assign (stmt))
-    lhs = gimple_assign_lhs (stmt);
-  else if (is_gimple_call (stmt))
-    lhs = gimple_call_lhs (stmt);
-  else
-    gcc_unreachable ();
+  tree decl, repl, new_name;
 
-  if (TREE_CODE (lhs) != SSA_NAME)
-    return false;
+  if (TREE_CODE (old_name) != SSA_NAME)
+    return NULL;
 
-  decl = SSA_NAME_VAR (lhs);
+  decl = SSA_NAME_VAR (old_name);
   if (decl == NULL_TREE
       || TREE_CODE (decl) != PARM_DECL)
-    return false;
+    return NULL;
 
   adj = get_adjustment_for_base (adjustments, decl);
   if (!adj)
-    return false;
+    return NULL;
 
   repl = get_replaced_param_substitute (adj);
-  name = make_ssa_name (repl, stmt);
+  new_name = make_ssa_name (repl, stmt);
 
   if (dump_file)
     {
       fprintf (dump_file, "replacing an SSA name of a removed param ");
-      print_generic_expr (dump_file, lhs, 0);
+      print_generic_expr (dump_file, old_name, 0);
       fprintf (dump_file, " with ");
-      print_generic_expr (dump_file, name, 0);
+      print_generic_expr (dump_file, new_name, 0);
       fprintf (dump_file, "\n");
     }
 
-  if (is_gimple_assign (stmt))
-    gimple_assign_set_lhs (stmt, name);
-  else if (is_gimple_call (stmt))
-    gimple_call_set_lhs (stmt, name);
-  else
-    gimple_phi_set_result (stmt, name);
-
-  replace_uses_by (lhs, name);
-  release_ssa_name (lhs);
-  return true;
+  replace_uses_by (old_name, new_name);
+  return new_name;
 }
 
 /* If the statement pointed to by STMT_PTR contains any expressions that need
@@ -4599,7 +4583,16 @@ ipa_sra_modify_function_body (ipa_parm_adjustment_vec adjustments)
       gimple_stmt_iterator gsi;
 
       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
-       replace_removed_params_ssa_names (gsi_stmt (gsi), adjustments);
+       {
+         gimple phi = gsi_stmt (gsi);
+         tree new_lhs, old_lhs = gimple_phi_result (phi);
+         new_lhs = replace_removed_params_ssa_names (old_lhs, phi, adjustments);
+         if (new_lhs)
+           {
+             gimple_phi_set_result (phi, new_lhs);
+             release_ssa_name (old_lhs);
+           }
+       }
 
       gsi = gsi_start_bb (bb);
       while (!gsi_end_p (gsi))
@@ -4619,7 +4612,6 @@ ipa_sra_modify_function_body (ipa_parm_adjustment_vec adjustments)
 
            case GIMPLE_ASSIGN:
              modified |= sra_ipa_modify_assign (&stmt, &gsi, adjustments);
-             modified |= replace_removed_params_ssa_names (stmt, adjustments);
              break;
 
            case GIMPLE_CALL:
@@ -4634,8 +4626,6 @@ ipa_sra_modify_function_body (ipa_parm_adjustment_vec adjustments)
                {
                  t = gimple_call_lhs_ptr (stmt);
                  modified |= ipa_modify_expr (t, false, adjustments);
-                 modified |= replace_removed_params_ssa_names (stmt,
-                                                               adjustments);
                }
              break;
 
@@ -4656,6 +4646,20 @@ ipa_sra_modify_function_body (ipa_parm_adjustment_vec adjustments)
              break;
            }
 
+         def_operand_p defp;
+         ssa_op_iter iter;
+         FOR_EACH_SSA_DEF_OPERAND (defp, stmt, iter, SSA_OP_DEF)
+           {
+             tree old_def = DEF_FROM_PTR (defp);
+             if (tree new_def = replace_removed_params_ssa_names (old_def, stmt,
+                                                                  adjustments))
+               {
+                 SET_DEF (defp, new_def);
+                 release_ssa_name (old_def);
+                 modified = true;
+               }
+           }
+
          if (modified)
            {
              update_stmt (stmt);