common.opt (ftree-coalesce-inlined-vars): New.

gcc/ChangeLog:
* 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.
gcc/testsuite/ChangeLog:
* 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.

From-SVN: r188526
This commit is contained in:
Alexandre Oliva 2012-06-13 20:41:41 +00:00 committed by Alexandre Oliva
parent b78fd1642a
commit 21d01365ab
8 changed files with 52 additions and 10 deletions

View File

@ -1,3 +1,11 @@
2012-06-13 Alexandre Oliva <aoliva@redhat.com>
* 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.
2012-06-13 Richard Sandiford <rdsandiford@googlemail.com> 2012-06-13 Richard Sandiford <rdsandiford@googlemail.com>
* read-rtl.c (mapping): Remove index field. Add current_value field. * read-rtl.c (mapping): Remove index field. Add current_value field.

View File

@ -1944,6 +1944,14 @@ ftree-ch
Common Report Var(flag_tree_ch) Optimization Common Report Var(flag_tree_ch) Optimization
Enable loop header copying on trees 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 ftree-copyrename
Common Report Var(flag_tree_copyrename) Optimization Common Report Var(flag_tree_copyrename) Optimization
Replace SSA temporaries with better names in copies Replace SSA temporaries with better names in copies

View File

@ -405,7 +405,8 @@ Objective-C and Objective-C++ Dialects}.
-fsplit-ivs-in-unroller -fsplit-wide-types -fstack-protector @gol -fsplit-ivs-in-unroller -fsplit-wide-types -fstack-protector @gol
-fstack-protector-all -fstrict-aliasing -fstrict-overflow @gol -fstack-protector-all -fstrict-aliasing -fstrict-overflow @gol
-fthread-jumps -ftracer -ftree-bit-ccp @gol -fthread-jumps -ftracer -ftree-bit-ccp @gol
-ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-copy-prop @gol -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-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse @gol
-ftree-forwprop -ftree-fre -ftree-loop-if-convert @gol -ftree-forwprop -ftree-fre -ftree-loop-if-convert @gol
-ftree-loop-if-convert-stores -ftree-loop-im @gol -ftree-loop-if-convert-stores -ftree-loop-im @gol
@ -7490,6 +7491,24 @@ temporaries to other variables at copy locations, usually resulting in
variable names which more closely resemble the original variables. This flag variable names which more closely resemble the original variables. This flag
is enabled by default at @option{-O} and higher. is enabled by default at @option{-O} and higher.
@item -ftree-coalesce-inlined-vars
Tell the copyrename pass (see @option{-ftree-copyrename}) to attempt to
combine small user-defined variables too, but only if they were inlined
from other functions. It is a more limited form of
@option{-ftree-coalesce-vars}. This may harm debug information of such
inlined variables, but it will keep variables of the inlined-into
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 copyrename pass (see @option{-ftree-copyrename}) to attempt to
combine small user-defined variables too, instead of just compiler
temporaries. This may severely limit the ability to debug an optimized
program compiled with @option{-fno-var-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 @item -ftree-ter
@opindex ftree-ter @opindex ftree-ter
Perform temporary expression replacement during the SSA->normal phase. Single Perform temporary expression replacement during the SSA->normal phase. Single

View File

@ -1,3 +1,9 @@
2012-06-13 Alexandre Oliva <aoliva@redhat.com>
* 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.
2012-06-13 Tobias Burnus <burnus@net-b.de> 2012-06-13 Tobias Burnus <burnus@net-b.de>
PR fortran/53643 PR fortran/53643

View File

@ -7,5 +7,5 @@ void test (int *b, int *e, int stride)
*p = 1; *p = 1;
} }
/* { dg-final { scan-tree-dump-times "PHI <p" 1 "ivopts"} } */ /* { dg-final { scan-tree-dump-times "PHI <\[pb\]" 1 "ivopts"} } */
/* { dg-final { cleanup-tree-dump "ivopts" } } */ /* { dg-final { cleanup-tree-dump "ivopts" } } */

View File

@ -16,5 +16,5 @@ int g(int *p, int n)
return q[-1]; return q[-1];
} }
/* { dg-final { scan-tree-dump-times "= MEM\\\[\\\(int \\\*\\\)a_.. \\\+ 4B\\\];" 2 "forwprop1" } } */ /* { dg-final { scan-tree-dump-times "= MEM\\\[\\\(int \\\*\\\)\[ap\]_.. \\\+ 4B\\\];" 2 "forwprop1" } } */
/* { dg-final { cleanup-tree-dump "forwprop1" } } */ /* { dg-final { cleanup-tree-dump "forwprop1" } } */

View File

@ -11,5 +11,5 @@ int f(int *a)
return *c + t; return *c + t;
} }
/* { dg-final { scan-tree-dump "Replaced \\\*c_\[^\n\].*with t_" "fre1" } } */ /* { dg-final { scan-tree-dump "Replaced \\\*\[ac\]_\[^\n\].*with t_" "fre1" } } */
/* { dg-final { cleanup-tree-dump "fre1" } } */ /* { dg-final { cleanup-tree-dump "fre1" } } */

View File

@ -194,20 +194,21 @@ copy_rename_partition_coalesce (var_map map, tree var1, tree var2, FILE *debug)
ign1 = TREE_CODE (root1) == VAR_DECL && DECL_IGNORED_P (root1); ign1 = TREE_CODE (root1) == VAR_DECL && DECL_IGNORED_P (root1);
ign2 = TREE_CODE (root2) == VAR_DECL && DECL_IGNORED_P (root2); ign2 = TREE_CODE (root2) == VAR_DECL && DECL_IGNORED_P (root2);
/* Never attempt to coalesce 2 user variables unless one is an inline /* Refrain from coalescing user variables, if requested. */
variable. */
if (!ign1 && !ign2) if (!ign1 && !ign2)
{ {
if (DECL_FROM_INLINE (root2)) if (flag_ssa_coalesce_vars && DECL_FROM_INLINE (root2))
ign2 = true; ign2 = true;
else if (DECL_FROM_INLINE (root1)) else if (flag_ssa_coalesce_vars && DECL_FROM_INLINE (root1))
ign1 = true; ign1 = true;
else else if (flag_ssa_coalesce_vars != 2)
{ {
if (debug) if (debug)
fprintf (debug, " : 2 different USER vars. No coalesce.\n"); fprintf (debug, " : 2 different USER vars. No coalesce.\n");
return false; return false;
} }
else
ign2 = true;
} }
/* If both values have default defs, we can't coalesce. If only one has a /* If both values have default defs, we can't coalesce. If only one has a