Add -fipa-cp-alignment
This patch adds -fipa-cp-alignment to provide a way to enable/disable alignment discovery and propagation in IPA-CP. gcc/ * common.opt (fipa-cp-alignment): New. * ipa-cp.c (ipcp_store_alignment_results): Check flag_ipa_cp_alignment. * opts.c (default_options_table): Enable -fipa-cp-alignment for -O2. (enable_fdo_optimizations): Set x_flag_ipa_cp_alignment. * doc/invoke.texi: Document -fipa-cp-alignment. gcc/testsuite/ * gcc.dg/ipa/propalign-3.c: New test. From-SVN: r220773
This commit is contained in:
parent
d420206ea5
commit
3c99176a7f
@ -1,3 +1,13 @@
|
||||
2015-02-17 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* common.opt (fipa-cp-alignment): New.
|
||||
* ipa-cp.c (ipcp_store_alignment_results): Check
|
||||
flag_ipa_cp_alignment.
|
||||
* opts.c (default_options_table): Enable -fipa-cp-alignment for
|
||||
-O2.
|
||||
(enable_fdo_optimizations): Set x_flag_ipa_cp_alignment.
|
||||
* doc/invoke.texi: Document -fipa-cp-alignment.
|
||||
|
||||
2015-02-17 Oleg Endo <olegendo@gcc.gnu.org>
|
||||
|
||||
PR target/64793
|
||||
|
@ -1458,6 +1458,10 @@ fipa-cp-clone
|
||||
Common Report Var(flag_ipa_cp_clone) Optimization
|
||||
Perform cloning to make Interprocedural constant propagation stronger
|
||||
|
||||
fipa-cp-alignment
|
||||
Common Report Var(flag_ipa_cp_alignment) Optimization
|
||||
Perform alignment discovery and propagation to make Interprocedural constant propagation stronger
|
||||
|
||||
fipa-profile
|
||||
Common Report Var(flag_ipa_profile) Init(0) Optimization
|
||||
Perform interprocedural profile propagation
|
||||
|
@ -387,7 +387,7 @@ Objective-C and Objective-C++ Dialects}.
|
||||
-fgcse-sm -fhoist-adjacent-loads -fif-conversion @gol
|
||||
-fif-conversion2 -findirect-inlining @gol
|
||||
-finline-functions -finline-functions-called-once -finline-limit=@var{n} @gol
|
||||
-finline-small-functions -fipa-cp -fipa-cp-clone @gol
|
||||
-finline-small-functions -fipa-cp -fipa-cp-clone -fipa-cp-alignment @gol
|
||||
-fipa-pta -fipa-profile -fipa-pure-const -fipa-reference -fipa-icf @gol
|
||||
-fira-algorithm=@var{algorithm} @gol
|
||||
-fira-region=@var{region} -fira-hoist-pressure @gol
|
||||
@ -7323,6 +7323,7 @@ also turns on the following optimization flags:
|
||||
-finline-small-functions @gol
|
||||
-findirect-inlining @gol
|
||||
-fipa-cp @gol
|
||||
-fipa-cp-alignment @gol
|
||||
-fipa-sra @gol
|
||||
-fipa-icf @gol
|
||||
-fisolate-erroneous-paths-dereference @gol
|
||||
@ -8302,6 +8303,14 @@ it may significantly increase code size
|
||||
(see @option{--param ipcp-unit-growth=@var{value}}).
|
||||
This flag is enabled by default at @option{-O3}.
|
||||
|
||||
@item -fipa-cp-alignment
|
||||
@opindex -fipa-cp-alignment
|
||||
When enabled, this optimization propagates alignment of function
|
||||
parameters to support better vectorization and string operations.
|
||||
|
||||
This flag is enabled by default at @option{-O2} and @option{-Os}. It
|
||||
requires that @option{-fipa-cp} is enabled.
|
||||
|
||||
@item -fipa-icf
|
||||
@opindex fipa-icf
|
||||
Perform Identical Code Folding for functions and read-only variables.
|
||||
|
@ -4323,6 +4323,15 @@ ipcp_store_alignment_results (void)
|
||||
bool dumped_sth = false;
|
||||
bool found_useful_result = false;
|
||||
|
||||
if (!opt_for_fn (node->decl, flag_ipa_cp_alignment))
|
||||
{
|
||||
if (dump_file)
|
||||
fprintf (dump_file, "Not considering %s for alignment discovery "
|
||||
"and propagate; -fipa-cp-alignment: disabled.\n",
|
||||
node->name ());
|
||||
continue;
|
||||
}
|
||||
|
||||
if (info->ipcp_orig_node)
|
||||
info = IPA_NODE_REF (info->ipcp_orig_node);
|
||||
|
||||
|
@ -493,6 +493,7 @@ static const struct default_options default_options_table[] =
|
||||
{ OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 },
|
||||
{ OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 },
|
||||
{ OPT_LEVELS_2_PLUS, OPT_fipa_cp, NULL, 1 },
|
||||
{ OPT_LEVELS_2_PLUS, OPT_fipa_cp_alignment, NULL, 1 },
|
||||
{ OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 },
|
||||
{ OPT_LEVELS_2_PLUS, OPT_fdevirtualize_speculatively, NULL, 1 },
|
||||
{ OPT_LEVELS_2_PLUS, OPT_fipa_sra, NULL, 1 },
|
||||
@ -1330,6 +1331,9 @@ enable_fdo_optimizations (struct gcc_options *opts,
|
||||
if (!opts_set->x_flag_ipa_cp_clone
|
||||
&& value && opts->x_flag_ipa_cp)
|
||||
opts->x_flag_ipa_cp_clone = value;
|
||||
if (!opts_set->x_flag_ipa_cp_alignment
|
||||
&& value && opts->x_flag_ipa_cp)
|
||||
opts->x_flag_ipa_cp_alignment = value;
|
||||
if (!opts_set->x_flag_predictive_commoning)
|
||||
opts->x_flag_predictive_commoning = value;
|
||||
if (!opts_set->x_flag_unswitch_loops)
|
||||
|
@ -1,3 +1,7 @@
|
||||
2015-02-17 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* gcc.dg/ipa/propalign-3.c: New test.
|
||||
|
||||
2015-02-17 Oleg Endo <olegendo@gcc.gnu.org>
|
||||
|
||||
PR target/64793
|
||||
|
58
gcc/testsuite/gcc.dg/ipa/propalign-3.c
Normal file
58
gcc/testsuite/gcc.dg/ipa/propalign-3.c
Normal file
@ -0,0 +1,58 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fno-ipa-cp-alignment -fno-early-inlining -fdump-ipa-cp -fdump-tree-optimized" } */
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
extern int fail_the_test(void *);
|
||||
extern int pass_the_test(void *);
|
||||
extern int diversion (void *);
|
||||
|
||||
struct somestruct
|
||||
{
|
||||
void *whee;
|
||||
void *oops;
|
||||
};
|
||||
|
||||
struct container
|
||||
{
|
||||
struct somestruct first;
|
||||
struct somestruct buf[32];
|
||||
};
|
||||
|
||||
static int __attribute__((noinline))
|
||||
foo (void *p)
|
||||
{
|
||||
uintptr_t a = (uintptr_t) p;
|
||||
|
||||
if (a % 4)
|
||||
return fail_the_test (p);
|
||||
else
|
||||
return pass_the_test (p);
|
||||
}
|
||||
|
||||
int
|
||||
bar (void)
|
||||
{
|
||||
struct container c;
|
||||
return foo (c.buf);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
through (struct somestruct *p)
|
||||
{
|
||||
diversion (p);
|
||||
return foo (&p[16]);
|
||||
}
|
||||
|
||||
int
|
||||
bar2 (void)
|
||||
{
|
||||
struct container c;
|
||||
through (c.buf);
|
||||
}
|
||||
|
||||
/* { dg-final { scan-ipa-dump-not "Adjusting alignment of param" "cp" } } */
|
||||
/* { dg-final { scan-tree-dump "fail_the_test" "optimized" } } */
|
||||
/* { dg-final { cleanup-ipa-dump "cp" } } */
|
||||
/* { dg-final { cleanup-tree-dump "optimized" } } */
|
Loading…
x
Reference in New Issue
Block a user