From 39cc8c3d6bc5bd2d202a368bec2770c86497a408 Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Fri, 18 Nov 2011 16:13:54 +0100 Subject: [PATCH] re PR tree-optimization/50605 (ice in ipa_get_jf_pass_through_result with -O3) 2011-11-18 Martin Jambor 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 | 6 +++++ gcc/gimple.c | 12 ++++++++- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/g++.dg/ipa/pr50605.C | 40 ++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/ipa/pr50605.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 16272e4be11..6fb03faab6f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-11-18 Martin Jambor + + PR tree-optimization/50605 + * gimple.c (is_gimple_ip_invariant_address): Also handle MEM_REFs + of IPA invariant decls. + 2011-11-18 Bill Schmidt * tree-outof-ssa.c (insert_back_edge_copies): Add call to diff --git a/gcc/gimple.c b/gcc/gimple.c index 6168d33ac05..071c6515b4c 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; - return op && (CONSTANT_CLASS_P (op) || decl_address_ip_invariant_p (op)); + 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 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 f3157fc207c..1edc46c4e19 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-11-18 Martin Jambor + + PR tree-optimization/50605 + * g++.dg/ipa/pr50605.C: New test. + 2011-11-18 Dodji Seketeli 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 00000000000..4910a37f8f2 --- /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); +} +