diff mbox

: Add -fipa-cp-alignment

Message ID 20150217190822.GA9937@intel.com
State New
Headers show

Commit Message

H.J. Lu Feb. 17, 2015, 7:08 p.m. UTC
This patch adds -fipa-cp-alignment to provide a way to enable/disable
alignment discovery and propagation in IPA-CP.  OK for trunk?

Thanks.


H.J.
--
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.

Comments

Jan Hubicka Feb. 17, 2015, 8:13 p.m. UTC | #1
> This patch adds -fipa-cp-alignment to provide a way to enable/disable
> alignment discovery and propagation in IPA-CP.  OK for trunk?
> 
> Thanks.
> diff --git a/gcc/common.opt b/gcc/common.opt
> index 0c60e84..e0d4a1d 100644
> --- a/gcc/common.opt
> +++ b/gcc/common.opt
> @@ -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
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index 62bcece..6264034 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -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,12 @@ 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
> +Perform alignment discovery and propagation to make interprocedural
> +constant propagation stronger.  When enabled, interprocedural constant
> +propagation performs discovery and propagation of pointer alignment.

I think you want to mention that it is enabled by -O1+ (?) and that it needs
-fipa-cp.
Also I think the description is somewhat confusing.  The optimization propagate
alignment of function parameters to support better vectorization and string
operations, perhaps?

OK with these changes.

Honza
diff mbox

Patch

diff --git a/gcc/common.opt b/gcc/common.opt
index 0c60e84..e0d4a1d 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -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
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 62bcece..6264034 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -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,12 @@  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
+Perform alignment discovery and propagation to make interprocedural
+constant propagation stronger.  When enabled, interprocedural constant
+propagation performs discovery and propagation of pointer alignment.
+
 @item -fipa-icf
 @opindex fipa-icf
 Perform Identical Code Folding for functions and read-only variables.
diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
index 440ced4..103ac99 100644
--- a/gcc/ipa-cp.c
+++ b/gcc/ipa-cp.c
@@ -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);
 
diff --git a/gcc/opts.c b/gcc/opts.c
index 4a1ed0e..39c190d 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -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)
diff --git a/gcc/testsuite/gcc.dg/ipa/propalign-3.c b/gcc/testsuite/gcc.dg/ipa/propalign-3.c
new file mode 100644
index 0000000..e647cb1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/propalign-3.c
@@ -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" } } */