aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2011-11-18 16:13:54 +0100
committerMartin Jambor <jamborm@gcc.gnu.org>2011-11-18 16:13:54 +0100
commit39cc8c3d6bc5bd2d202a368bec2770c86497a408 (patch)
treeac6d85de16d80fdad124ecf877b09fc745dc5d89
parentf252165363acf536369823939446bf1459862852 (diff)
downloadgcc-39cc8c3d6bc5bd2d202a368bec2770c86497a408.zip
gcc-39cc8c3d6bc5bd2d202a368bec2770c86497a408.tar.gz
gcc-39cc8c3d6bc5bd2d202a368bec2770c86497a408.tar.bz2
re PR tree-optimization/50605 (ice in ipa_get_jf_pass_through_result with -O3)
2011-11-18 Martin Jambor <mjambor@suse.cz> PR tree-optimization/50605 * gimple.c (is_gimple_ip_invariant_address): Also handle MEM_REFs of IPA invariant decls. * testsuite/g++.dg/ipa/pr50605.C: New test. From-SVN: r181477
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/gimple.c12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ipa/pr50605.C40
4 files changed, 62 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 16272e4..6fb03fa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2011-11-18 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/50605
+ * gimple.c (is_gimple_ip_invariant_address): Also handle MEM_REFs
+ of IPA invariant decls.
+
2011-11-18 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* tree-outof-ssa.c (insert_back_edge_copies): Add call to
diff --git a/gcc/gimple.c b/gcc/gimple.c
index 6168d33..071c651 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -2858,8 +2858,18 @@ is_gimple_ip_invariant_address (const_tree t)
return false;
op = strip_invariant_refs (TREE_OPERAND (t, 0));
+ if (!op)
+ return false;
+
+ if (TREE_CODE (op) == MEM_REF)
+ {
+ const_tree op0 = TREE_OPERAND (op, 0);
+ return (TREE_CODE (op0) == ADDR_EXPR
+ && (CONSTANT_CLASS_P (TREE_OPERAND (op0, 0))
+ || decl_address_ip_invariant_p (TREE_OPERAND (op0, 0))));
+ }
- return op && (CONSTANT_CLASS_P (op) || decl_address_ip_invariant_p (op));
+ return CONSTANT_CLASS_P (op) || decl_address_ip_invariant_p (op);
}
/* Return true if T is a GIMPLE minimal invariant. It's a restricted
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f3157fc..1edc46c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-11-18 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/50605
+ * g++.dg/ipa/pr50605.C: New test.
+
2011-11-18 Dodji Seketeli <dodji@redhat.com>
PR c++/51191
diff --git a/gcc/testsuite/g++.dg/ipa/pr50605.C b/gcc/testsuite/g++.dg/ipa/pr50605.C
new file mode 100644
index 0000000..4910a37
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/pr50605.C
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fno-early-inlining" } */
+
+class A
+{
+public:
+ int a;
+ void *stuff;
+};
+
+class B
+{
+public:
+ int b;
+ void *other_stuff;
+ A array[50];
+};
+
+extern B gb;
+
+int process_A (A *a)
+{
+ return a->a;
+}
+
+int process_A_complex (A *a)
+{
+ return process_A (a+3);
+}
+
+int process_B (B *b)
+{
+ return process_A_complex (&b->array[0]);
+}
+
+int foo (void)
+{
+ return process_B (&gb);
+}
+