re PR tree-optimization/50605 (ice in ipa_get_jf_pass_through_result with -O3)
authorMartin Jambor <mjambor@suse.cz>
Fri, 18 Nov 2011 15:13:54 +0000 (16:13 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Fri, 18 Nov 2011 15:13:54 +0000 (16:13 +0100)
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

gcc/ChangeLog
gcc/gimple.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ipa/pr50605.C [new file with mode: 0644]

index 16272e4be11b0aab29129c9ada82df48ea71c1ab..6fb03faab6fa0981837de81b60de42e96f5f553f 100644 (file)
@@ -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
index 6168d33ac0508ee85ad98a3260c567063873a183..071c6515b4cae3f008672714d3937b890968bf71 100644 (file)
@@ -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
index f3157fc207c706fff13da65c667e4efdd114ed6d..1edc46c4e19f2b7b4ef96caa5bef9c24abc4a7bd 100644 (file)
@@ -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 (file)
index 0000000..4910a37
--- /dev/null
@@ -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);
+}
+