mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
[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
This commit is contained in:
committed by
Martin Jambor
parent
1a025b0575
commit
6651d6b42e
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
34
gcc/testsuite/gcc.dg/ipa/ipa-sra-10.c
Normal file
34
gcc/testsuite/gcc.dg/ipa/ipa-sra-10.c
Normal file
@@ -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" } } */
|
||||
15
gcc/testsuite/gcc.dg/torture/pr67794.c
Normal file
15
gcc/testsuite/gcc.dg/torture/pr67794.c
Normal file
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
tree decl, repl, new_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 ();
|
||||
if (TREE_CODE (old_name) != SSA_NAME)
|
||||
return NULL;
|
||||
|
||||
if (TREE_CODE (lhs) != SSA_NAME)
|
||||
return false;
|
||||
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user