diff options
author | Martin Jambor <mjambor@suse.cz> | 2015-10-09 15:13:38 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2015-10-09 15:13:38 +0200 |
commit | 6651d6b42eab75d16eb5e764fceab9e4e4d7a71d (patch) | |
tree | 311e1178ee2b0ba6cad68802df2ea5374cc0fa25 | |
parent | 1a025b0575e33f9715e18815f9bc55e1df83df8e (diff) | |
download | gcc-6651d6b42eab75d16eb5e764fceab9e4e4d7a71d.zip gcc-6651d6b42eab75d16eb5e764fceab9e4e4d7a71d.tar.gz gcc-6651d6b42eab75d16eb5e764fceab9e4e4d7a71d.tar.bz2 |
[PR 67794] Also remap SSA_NAMEs defined in ASMs in IPA-SRA
2015-10-09 Martin Jambor <mjambor@suse.cz>
tree-optimization/67794
* tree-sra.c (replace_removed_params_ssa_names): Do not distinguish
between types of state,ents 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: Nw test.
* gcc.dg/torture/pr67794.c: Likewise.
From-SVN: r228654
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/ipa/ipa-sra-10.c | 34 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr67794.c | 15 | ||||
-rw-r--r-- | gcc/tree-sra.c | 80 |
5 files changed, 106 insertions, 38 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cf239b0..81f6ad8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2015-10-09 Martin Jambor <mjambor@suse.cz> + + tree-optimization/67794 + * tree-sra.c (replace_removed_params_ssa_names): Do not distinguish + between types of state,ents but accept original definitions as a + parameter. + (ipa_sra_modify_function_body): Use FOR_EACH_SSA_DEF_OPERAND to + iterate over definitions. + 2015-10-09 James Norris <jnorris@codesourcery.com> * config/rs6000/rs6000.c (rs6000_offload_options): New. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e5673bd..cca7bdf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-10-09 Martin Jambor <mjambor@suse.cz> + + tree-optimization/67794 + * gcc.dg/ipa/ipa-sra-10.c: Nw test. + * gcc.dg/torture/pr67794.c: Likewise. + 2015-10-09 Alexandre Oliva <aoliva@redhat.com> PR rtl-optimization/67828 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 index 0000000..24b64d1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/ipa-sra-10.c @@ -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 index 0000000..5489e56 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr67794.c @@ -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); +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 4327990..f851758 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -4612,61 +4612,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 (as_a <gphi *> (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 STMT contains any expressions that need to replaced with a @@ -4745,7 +4729,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); + { + gphi *phi = as_a <gphi *> (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)) @@ -4765,7 +4758,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: @@ -4780,8 +4772,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; @@ -4805,6 +4795,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); |