aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple.c
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 /gcc/gimple.c
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
Diffstat (limited to 'gcc/gimple.c')
-rw-r--r--gcc/gimple.c12
1 files changed, 11 insertions, 1 deletions
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