diff options
author | Richard Guenther <rguenther@suse.de> | 2012-08-13 09:29:28 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2012-08-13 09:29:28 +0000 |
commit | 61f7b9ae9314c2e69f12508f10e0643db1cd5d25 (patch) | |
tree | 7c5e8c4bffe7ee3b7011e166aad59c25d4c19ff7 /gcc/tree-ssa-copyrename.c | |
parent | f27c1867108c24557452bc6ea11196c7e7f09801 (diff) | |
download | gcc-61f7b9ae9314c2e69f12508f10e0643db1cd5d25.zip gcc-61f7b9ae9314c2e69f12508f10e0643db1cd5d25.tar.gz gcc-61f7b9ae9314c2e69f12508f10e0643db1cd5d25.tar.bz2 |
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
Diffstat (limited to 'gcc/tree-ssa-copyrename.c')
-rw-r--r-- | gcc/tree-ssa-copyrename.c | 52 |
1 files changed, 45 insertions, 7 deletions
diff --git a/gcc/tree-ssa-copyrename.c b/gcc/tree-ssa-copyrename.c index 82f8c64..387e67b 100644 --- a/gcc/tree-ssa-copyrename.c +++ b/gcc/tree-ssa-copyrename.c @@ -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); + } } } |