for gcc/ChangeLog from Alexandre Oliva * common.opt (ftree-coalesce-inlined-vars): New. (ftree-coalesce-vars): New. * doc/invoke.texi: Document them. * tree-ssa-copyrename.c (copy_rename_partition_coalesce): Implement them. for gcc/testsuite/ChangeLog from Alexandre Oliva * g++.dg/tree-ssa/ivopts-2.C: Adjust for coalescing. * gcc.dg/tree-ssa/forwprop-11.c: Likewise. * gcc.dg/tree-ssa/ssa-fre-1.c: Likewise. * gcc.dg/guality/bswaptest.c: Avoid coalescing and early death of test variable. * gcc.dg/guality/clztest.c: Likewise. * gcc.dg/guality/ctztest.c: Likewise. * gcc.dg/guality/rotatetest.c: Likewise. Index: gcc/common.opt =================================================================== --- gcc/common.opt.orig 2011-06-04 09:00:30.005102549 -0300 +++ gcc/common.opt 2011-06-04 09:01:29.199347556 -0300 @@ -1898,6 +1898,14 @@ ftree-ch Common Report Var(flag_tree_ch) Optimization Enable loop header copying on trees +ftree-coalesce-inlined-vars +Common Report Var(flag_ssa_coalesce_vars,1) Init(2) RejectNegative Optimization +Enable coalescing of copy-related user variables that are inlined + +ftree-coalesce-vars +Common Report Var(flag_ssa_coalesce_vars,2) Optimization +Enable coalescing of all copy-related user variables + ftree-copyrename Common Report Var(flag_tree_copyrename) Optimization Replace SSA temporaries with better names in copies Index: gcc/tree-ssa-copyrename.c =================================================================== --- gcc/tree-ssa-copyrename.c.orig 2011-06-04 09:00:30.160103200 -0300 +++ gcc/tree-ssa-copyrename.c 2011-06-04 09:01:29.252347770 -0300 @@ -194,20 +194,21 @@ copy_rename_partition_coalesce (var_map ign1 = TREE_CODE (root1) == VAR_DECL && DECL_IGNORED_P (root1); ign2 = TREE_CODE (root2) == VAR_DECL && DECL_IGNORED_P (root2); - /* Never attempt to coalesce 2 user variables unless one is an inline - variable. */ + /* Refrain from coalescing user variables, if requested. */ if (!ign1 && !ign2) { - if (DECL_FROM_INLINE (root2)) + if (flag_ssa_coalesce_vars && DECL_FROM_INLINE (root2)) ign2 = true; - else if (DECL_FROM_INLINE (root1)) + else if (flag_ssa_coalesce_vars && DECL_FROM_INLINE (root1)) ign1 = true; - else + else if (flag_ssa_coalesce_vars != 2) { if (debug) fprintf (debug, " : 2 different USER vars. No coalesce.\n"); return false; } + else + ign2 = true; } /* If both values have default defs, we can't coalesce. If only one has a Index: gcc/doc/invoke.texi =================================================================== --- gcc/doc/invoke.texi.orig 2011-06-04 09:00:30.665105322 -0300 +++ gcc/doc/invoke.texi 2011-06-04 09:01:29.479348698 -0300 @@ -395,8 +395,8 @@ Objective-C and Objective-C++ Dialects}. -fsignaling-nans -fsingle-precision-constant -fsplit-ivs-in-unroller @gol -fsplit-wide-types -fstack-protector -fstack-protector-all @gol -fstrict-aliasing -fstrict-overflow -fthread-jumps -ftracer @gol --ftree-bit-ccp @gol --ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-copy-prop @gol +-ftree-bit-ccp -ftree-builtin-call-dce -ftree-ccp -ftree-ch @gol +-ftree-coalesce-inline-vars -ftree-coalesce-vars -ftree-copy-prop @gol -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse @gol -ftree-forwprop -ftree-fre -ftree-loop-if-convert @gol -ftree-loop-if-convert-stores -ftree-loop-im @gol @@ -7231,6 +7231,22 @@ temporaries to other variables at copy l variable names which more closely resemble the original variables. This flag is enabled by default at @option{-O} and higher. +@item -ftree-coalesce-inlined-vars +A more limited form of @option{-ftree-coalesce-vars}, that performs +the transformation if at least one of the variables was inlined. This +may harm debug information of such inlined variables, but it will keep +variables of the main function apart from each other, such that they +are more likely to contain the expected values in a debugging session. +This was the default in GCC versions older than 4.7. + +@item -ftree-coalesce-vars +Tell the compiler to attempt to combine small user variables that +don't need to live in memory, when it finds a copy between them. This +may severely limit the ability to debug an optimized program compiled +without @option{-fvar-tracking-assignments}. In the negated form, +this flag prevents SSA coalescing of user variables, including inlined +ones. This option is enabled by default. + @item -ftree-ter @opindex ftree-ter Perform temporary expression replacement during the SSA->normal phase. Single Index: gcc/testsuite/g++.dg/tree-ssa/ivopts-2.C =================================================================== --- gcc/testsuite/g++.dg/tree-ssa/ivopts-2.C.orig 2011-06-04 09:13:29.613784393 -0300 +++ gcc/testsuite/g++.dg/tree-ssa/ivopts-2.C 2011-06-04 09:16:24.688235836 -0300 @@ -7,5 +7,5 @@ void test (int *b, int *e, int stride) *p = 1; } -/* { dg-final { scan-tree-dump-times "PHI