aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-04-25 07:44:40 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-04-25 07:44:40 +0000
commit78422fb13c3f57b962d4c6cff7a9493ea3b12c14 (patch)
tree8704edaf42da9ff264a1161053e6f508bbca568f
parent9490b8da72088fe6f1b23c323749d977e3aa02f1 (diff)
downloadgcc-78422fb13c3f57b962d4c6cff7a9493ea3b12c14.zip
gcc-78422fb13c3f57b962d4c6cff7a9493ea3b12c14.tar.gz
gcc-78422fb13c3f57b962d4c6cff7a9493ea3b12c14.tar.bz2
re PR ipa/60911 (wrong code with -O2 -flto -fipa-pta)
2014-04-25 Richard Biener <rguenther@suse.de> PR ipa/60911 * passes.c (apply_ipa_transforms): Inline into only caller ... (execute_one_pass): ... here. Properly bring in function bodies for nodes we want to apply IPA transforms to. * gcc.dg/lto/pr60911_0.c: New testcase. From-SVN: r209779
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/passes.c34
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr60911_0.c21
4 files changed, 52 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3eb5c43..ec3c2e2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2014-04-25 Richard Biener <rguenther@suse.de>
+
+ PR ipa/60911
+ * passes.c (apply_ipa_transforms): Inline into only caller ...
+ (execute_one_pass): ... here. Properly bring in function
+ bodies for nodes we want to apply IPA transforms to.
+
2014-04-24 Cong Hou <congh@google.com>
PR tree-optimization/60896
diff --git a/gcc/passes.c b/gcc/passes.c
index 2be7856..fb60fc8 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -2039,20 +2039,6 @@ execute_all_ipa_transforms (void)
}
}
-/* Callback for do_per_function to apply all IPA transforms. */
-
-static void
-apply_ipa_transforms (void *data)
-{
- struct cgraph_node *node = cgraph_get_node (current_function_decl);
- if (!node->global.inlined_to && node->ipa_transforms_to_apply.exists ())
- {
- *(bool *)data = true;
- execute_all_ipa_transforms ();
- rebuild_cgraph_edges ();
- }
-}
-
/* Check if PASS is explicitly disabled or enabled and return
the gate status. FUNC is the function to be processed, and
GATE_STATUS is the gate status determined by pass manager by
@@ -2124,8 +2110,26 @@ execute_one_pass (opt_pass *pass)
Apply all trnasforms first. */
if (pass->type == SIMPLE_IPA_PASS)
{
+ struct cgraph_node *node;
bool applied = false;
- do_per_function (apply_ipa_transforms, (void *)&applied);
+ FOR_EACH_DEFINED_FUNCTION (node)
+ if (node->analyzed
+ && cgraph_function_with_gimple_body_p (node)
+ && (!node->clone_of || node->decl != node->clone_of->decl))
+ {
+ if (!node->global.inlined_to
+ && node->ipa_transforms_to_apply.exists ())
+ {
+ cgraph_get_body (node);
+ push_cfun (DECL_STRUCT_FUNCTION (node->decl));
+ execute_all_ipa_transforms ();
+ rebuild_cgraph_edges ();
+ free_dominance_info (CDI_DOMINATORS);
+ free_dominance_info (CDI_POST_DOMINATORS);
+ pop_cfun ();
+ applied = true;
+ }
+ }
if (applied)
symtab_remove_unreachable_nodes (true, dump_file);
/* Restore current_pass. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0191262..6d0fe01 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-04-25 Richard Biener <rguenther@suse.de>
+
+ PR ipa/60911
+ * gcc.dg/lto/pr60911_0.c: New testcase.
+
2014-04-24 Cong Hou <congh@google.com>
PR tree-optimization/60896
diff --git a/gcc/testsuite/gcc.dg/lto/pr60911_0.c b/gcc/testsuite/gcc.dg/lto/pr60911_0.c
new file mode 100644
index 0000000..e4820a2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/lto/pr60911_0.c
@@ -0,0 +1,21 @@
+// { dg-lto-do run }
+// { dg-lto-options { { -O2 -flto -fipa-pta } } }
+
+int __attribute__ ((__noinline__)) f (unsigned *p, int *x)
+{
+ int y = *p++ & 0xfff;
+ *x++ = y;
+ *x = *p;
+ return y;
+}
+
+int
+main ()
+{
+ unsigned u[2] = { 0x3aad, 0x5ad1 };
+ int x[2] = { 17689, 23456 };
+
+ if (f (u, x) != 0xaad || x[0] != 0xaad || x[1] != 0x5ad1)
+ __builtin_abort ();
+ return 0;
+}