tree-sra.c (early_sra): New.
authorRichard Henderson <rth@redhat.com>
Wed, 14 Feb 2007 17:52:25 +0000 (09:52 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 14 Feb 2007 17:52:25 +0000 (09:52 -0800)
        * tree-sra.c (early_sra): New.
        (decl_can_be_decomposed_p): Deny va_list if early_sra.
        (tree_sra_early, pass_sra_early): New.
        * tree-pass.h (pass_sra_early): Declare.
        * passes.c (init_optimization_passes): Use it.

From-SVN: r121953

gcc/ChangeLog
gcc/passes.c
gcc/tree-pass.h
gcc/tree-sra.c

index b3bff51..04b06a8 100644 (file)
@@ -1,3 +1,11 @@
+2007-02-14  Richard Henderson  <rth@redhat.com>
+
+       * tree-sra.c (early_sra): New.
+       (decl_can_be_decomposed_p): Deny va_list if early_sra.
+       (tree_sra_early, pass_sra_early): New.
+       * tree-pass.h (pass_sra_early): Declare.
+       * passes.c (init_optimization_passes): Use it.
+
 2007-02-14  Richard Guenther  <rguenther@suse.de>
 
        * flags.h (issue_strict_overflow_warning): Convert to a macro.
index 6f1a99d..f90796d 100644 (file)
@@ -489,7 +489,7 @@ init_optimization_passes (void)
          NEXT_PASS (pass_rename_ssa_copies);
          NEXT_PASS (pass_ccp);
          NEXT_PASS (pass_forwprop);
-         NEXT_PASS (pass_sra);
+         NEXT_PASS (pass_sra_early);
          NEXT_PASS (pass_copy_prop);
          NEXT_PASS (pass_merge_phi);
          NEXT_PASS (pass_dce);
index 56679ca..7cdee50 100644 (file)
@@ -241,6 +241,7 @@ extern struct tree_opt_pass pass_early_tree_profile;
 extern struct tree_opt_pass pass_cleanup_cfg;
 extern struct tree_opt_pass pass_referenced_vars;
 extern struct tree_opt_pass pass_sra;
+extern struct tree_opt_pass pass_sra_early;
 extern struct tree_opt_pass pass_tail_recursion;
 extern struct tree_opt_pass pass_tail_calls;
 extern struct tree_opt_pass pass_tree_loop;
index 03f9b59..e4a1107 100644 (file)
@@ -75,6 +75,9 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 */
 
 
+/* True if this is the "early" pass, before inlining.  */
+static bool early_sra;
+
 /* The set of todo flags to return from tree_sra.  */
 static unsigned int todoflags;
 
@@ -342,6 +345,17 @@ decl_can_be_decomposed_p (tree var)
       return false;
     }
 
+  /* HACK: if we decompose a va_list_type_node before inlining, then we'll
+     confuse tree-stdarg.c, and we won't be able to figure out which and
+     how many arguments are accessed.  This really should be improved in
+     tree-stdarg.c, as the decomposition is truely a win.  This could also
+     be fixed if the stdarg pass ran early, but this can't be done until
+     we've aliasing information early too.  See PR 30791.  */
+  if (early_sra
+      && TYPE_MAIN_VARIANT (TREE_TYPE (var))
+        == TYPE_MAIN_VARIANT (va_list_type_node))
+    return false;
+
   return true;
 }
 
@@ -2365,12 +2379,44 @@ tree_sra (void)
   return todoflags;
 }
 
+static unsigned int
+tree_sra_early (void)
+{
+  unsigned int ret;
+
+  early_sra = true;
+  ret = tree_sra ();
+  early_sra = false;
+
+  return ret;
+}
+
 static bool
 gate_sra (void)
 {
   return flag_tree_sra != 0;
 }
 
+struct tree_opt_pass pass_sra_early =
+{
+  "esra",                              /* name */
+  gate_sra,                            /* gate */
+  tree_sra_early,                      /* execute */
+  NULL,                                        /* sub */
+  NULL,                                        /* next */
+  0,                                   /* static_pass_number */
+  TV_TREE_SRA,                         /* tv_id */
+  PROP_cfg | PROP_ssa,                 /* properties_required */
+  0,                                   /* properties_provided */
+  0,                                   /* properties_destroyed */
+  0,                                   /* todo_flags_start */
+  TODO_dump_func
+  | TODO_update_ssa
+  | TODO_ggc_collect
+  | TODO_verify_ssa,                   /* todo_flags_finish */
+  0                                    /* letter */
+};
+
 struct tree_opt_pass pass_sra =
 {
   "sra",                               /* name */