From 029f45bdc15fe9c0b6fdafe5b2aa973c62c6eaf1 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Wed, 14 Feb 2007 09:52:25 -0800 Subject: [PATCH] tree-sra.c (early_sra): New. * 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 | 8 ++++++++ gcc/passes.c | 2 +- gcc/tree-pass.h | 1 + gcc/tree-sra.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b3bff513d70..04b06a863d8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2007-02-14 Richard Henderson + + * 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 * flags.h (issue_strict_overflow_warning): Convert to a macro. diff --git a/gcc/passes.c b/gcc/passes.c index 6f1a99d0601..f90796d0461 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -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); diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h index 56679ca96d0..7cdee50f609 100644 --- a/gcc/tree-pass.h +++ b/gcc/tree-pass.h @@ -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; diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 03f9b59526a..e4a1107ab45 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -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 */