re PR tree-optimization/54200 (copyrename generates wrong debuginfo)

2012-08-13  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/54200
	* tree-ssa-copyrename.c (rename_ssa_copies): Do not add
	PHI results to another partition if not all PHI arguments
	have the same partition.

	* gcc.dg/guality/pr54200.c: New testcase.
	* gcc.dg/tree-ssa/slsr-8.c: Adjust.

From-SVN: r190339
This commit is contained in:
Richard Guenther 2012-08-13 09:29:28 +00:00 committed by Richard Biener
parent f27c186710
commit 61f7b9ae93
5 changed files with 89 additions and 10 deletions

View File

@ -1,3 +1,10 @@
2012-08-13 Richard Guenther <rguenther@suse.de>
PR tree-optimization/54200
* tree-ssa-copyrename.c (rename_ssa_copies): Do not add
PHI results to another partition if not all PHI arguments
have the same partition.
2012-08-12 Jan Hubicka <jh@suse.cz>
* tree-pass.h (write_summary, write_optimization_summary): Remove

View File

@ -1,3 +1,9 @@
2012-08-13 Richard Guenther <rguenther@suse.de>
PR tree-optimization/54200
* gcc.dg/guality/pr54200.c: New testcase.
* gcc.dg/tree-ssa/slsr-8.c: Adjust.
2012-08-12 Oleg Endo <olegendo@gcc.gnu.org>
* gcc.target/sh/prefetch.c: Add -m3* to inclusion list.

View File

@ -0,0 +1,28 @@
/* PR tree-optimization/54200 */
/* { dg-do run } */
/* { dg-options "-g -fno-var-tracking-assignments" } */
int o __attribute__((used));
void bar (void) { o = 2; }
int __attribute__((noinline,noclone))
foo (int z, int x, int b)
{
if (x == 1)
{
bar ();
return z;
}
else
{
int a = (x + z) + b;
return a; /* { dg-final { gdb-test 20 "z" "3" } } */
}
}
int main ()
{
foo (3, 2, 1);
return 0;
}

View File

@ -17,7 +17,7 @@ f (int s, int *c)
return x1 ? x2 : x3;
}
/* There are 2 ' * ' instances in the decls (since "int * x3;" is
optimized out), 1 parm, 2 in the code. */
/* { dg-final { scan-tree-dump-times " \\* " 5 "optimized" } } */
/* There are 4 ' * ' instances in the decls (since "int * iftmp.0;" is
added), 1 parm, 2 in the code. */
/* { dg-final { scan-tree-dump-times " \\* " 7 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */

View File

@ -348,15 +348,53 @@ rename_ssa_copies (void)
res = gimple_phi_result (phi);
/* Do not process virtual SSA_NAMES. */
if (!is_gimple_reg (res))
if (virtual_operand_p (res))
continue;
for (i = 0; i < gimple_phi_num_args (phi); i++)
{
tree arg = gimple_phi_arg (phi, i)->def;
if (TREE_CODE (arg) == SSA_NAME)
updated |= copy_rename_partition_coalesce (map, res, arg, debug);
}
/* Make sure to only use the same partition for an argument
as the result but never the other way around. */
if (SSA_NAME_VAR (res)
&& !DECL_IGNORED_P (SSA_NAME_VAR (res)))
for (i = 0; i < gimple_phi_num_args (phi); i++)
{
tree arg = PHI_ARG_DEF (phi, i);
if (TREE_CODE (arg) == SSA_NAME)
updated |= copy_rename_partition_coalesce (map, res, arg,
debug);
}
/* Else if all arguments are in the same partition try to merge
it with the result. */
else
{
int all_p_same = -1;
int p = -1;
for (i = 0; i < gimple_phi_num_args (phi); i++)
{
tree arg = PHI_ARG_DEF (phi, i);
if (TREE_CODE (arg) != SSA_NAME)
{
all_p_same = 0;
break;
}
else if (all_p_same == -1)
{
p = partition_find (map->var_partition,
SSA_NAME_VERSION (arg));
all_p_same = 1;
}
else if (all_p_same == 1
&& p != partition_find (map->var_partition,
SSA_NAME_VERSION (arg)))
{
all_p_same = 0;
break;
}
}
if (all_p_same == 1)
updated |= copy_rename_partition_coalesce (map, res,
PHI_ARG_DEF (phi, 0),
debug);
}
}
}