re PR tree-optimization/17549 (10% increase in codesize with C code compared to GCC...
authorSteven Bosscher <stevenb@suse.de>
Thu, 10 Feb 2005 22:57:30 +0000 (22:57 +0000)
committerSteven Bosscher <steven@gcc.gnu.org>
Thu, 10 Feb 2005 22:57:30 +0000 (22:57 +0000)
PR tree-optimization/17549
* tree-outof-ssa.c (find_replaceable_in_bb): Do not allow
TER to replace a DEF with its expression if the DEF and the
rhs of the expression we replace into have the same root
variable.

From-SVN: r94853

gcc/ChangeLog
gcc/tree-outof-ssa.c

index 3ea3e792a90d3d5cbefd6df12380761dd09ef891..d86daf413ab1d21b5c9324c9e5fb762d263d3446 100644 (file)
@@ -1,3 +1,11 @@
+2005-02-10  Steven Bosscher  <stevenb@suse.de>
+
+       PR tree-optimization/17549
+       * tree-outof-ssa.c (find_replaceable_in_bb): Do not allow
+       TER to replace a DEF with its expression if the DEF and the
+       rhs of the expression we replace into have the same root
+       variable.
+
 2005-02-10  Richard Sandiford  <rsandifo@redhat.com>
 
        * config/mips/mips.md: Fix the placement of the match_scratch in the
index 65c74d310a4fe18b3eb546194b570b61f578cade..c6aa812bc1754d004496e7d33658a9d31b78c535 100644 (file)
@@ -1659,8 +1659,23 @@ find_replaceable_in_bb (temp_expr_table_p tab, basic_block bb)
        {
          if (tab->version_info[SSA_NAME_VERSION (def)])
            {
-             /* Mark expression as replaceable unless stmt is volatile.  */
-             if (!ann->has_volatile_ops)
+             bool same_root_var = false;
+             tree def2;
+             ssa_op_iter iter2;
+
+             /* See if the root variables are the same.  If they are, we
+                do not want to do the replacement to avoid problems with
+                code size, see PR tree-optimization/17549.  */
+             FOR_EACH_SSA_TREE_OPERAND (def2, stmt, iter2, SSA_OP_DEF)
+               if (SSA_NAME_VAR (def) == SSA_NAME_VAR (def2))
+                 {
+                   same_root_var = true;
+                   break;
+                 }
+
+             /* Mark expression as replaceable unless stmt is volatile
+                or DEF sets the same root variable as STMT.  */
+             if (!ann->has_volatile_ops && !same_root_var)
                mark_replaceable (tab, def);
              else
                finish_expr (tab, SSA_NAME_VERSION (def), false);