diff options
author | Martin Jambor <mjambor@suse.cz> | 2010-09-10 01:38:23 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2010-09-10 01:38:23 +0200 |
commit | d242d0634ca719a7c791ba626b4e6f87dd337e5e (patch) | |
tree | 951106b686b0e34fa68f8a0a3c5bed5ca6806875 /gcc/ipa-prop.c | |
parent | fffe1e4064df4724b2e5e7c57d8e478bd3ab22fe (diff) | |
download | gcc-d242d0634ca719a7c791ba626b4e6f87dd337e5e.zip gcc-d242d0634ca719a7c791ba626b4e6f87dd337e5e.tar.gz gcc-d242d0634ca719a7c791ba626b4e6f87dd337e5e.tar.bz2 |
re PR tree-optimization/44972 (ICE: in load_assign_lhs_subreplacements, at tree-sra.c:2475)
2010-09-10 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/44972
* tree-sra.c: Include toplev.h.
(build_ref_for_offset): Entirely reimplemented.
(build_ref_for_model): New function.
(build_user_friendly_ref_for_offset): New function.
(analyze_access_subtree): Removed build_ref_for_offset check.
(propagate_subaccesses_across_link): Likewise.
(create_artificial_child_access): Use
build_user_friendly_ref_for_offset.
(propagate_subaccesses_across_link): Likewise.
(ref_expr_for_all_replacements_p): Removed.
(generate_subtree_copies): Updated comment. Use build_ref_for_model.
(sra_modify_expr): Use build_ref_for_model.
(load_assign_lhs_subreplacements): Likewise.
(sra_modify_assign): Removed ref_expr_for_all_replacements_p checks,
checks for return values of build_ref_for_offset.
* ipa-cp.c (ipcp_lattice_from_jfunc): No need to check return value of
build_ref_for_offset.
* ipa-prop.h: Include gimple.h
* ipa-prop.c (ipa_compute_jump_functions): Update to look for MEM_REFs.
(ipa_analyze_indirect_call_uses): Update comment.
* Makefile.in (tree-sra.o): Add $(GIMPLE_H) to dependencies.
(IPA_PROP_H): Likewise.
* testsuite/gcc.dg/ipa/ipa-sra-1.c: Adjust scanning expressions.
* testsuite/gcc.dg/tree-ssa/pr45144.c: Likewise.
* testsuite/gcc.dg/tree-ssa/forwprop-5.c: Likewise and scan optimzed
dump instead.
* testsuite/g++.dg/torture/pr44972.C: New test.
From-SVN: r164136
Diffstat (limited to 'gcc/ipa-prop.c')
-rw-r--r-- | gcc/ipa-prop.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 0ad7324..ec45d7c 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -916,23 +916,27 @@ ipa_compute_jump_functions (struct cgraph_node *node, static tree ipa_get_member_ptr_load_param (tree rhs, bool use_delta) { - tree rec, fld; + tree rec, ref_offset, fld_offset; tree ptr_field; tree delta_field; - if (TREE_CODE (rhs) != COMPONENT_REF) + if (TREE_CODE (rhs) != MEM_REF) return NULL_TREE; - rec = TREE_OPERAND (rhs, 0); + if (TREE_CODE (rec) != ADDR_EXPR) + return NULL_TREE; + rec = TREE_OPERAND (rec, 0); if (TREE_CODE (rec) != PARM_DECL || !type_like_member_ptr_p (TREE_TYPE (rec), &ptr_field, &delta_field)) return NULL_TREE; - fld = TREE_OPERAND (rhs, 1); - if (use_delta ? (fld == delta_field) : (fld == ptr_field)) - return rec; + ref_offset = TREE_OPERAND (rhs, 1); + if (use_delta) + fld_offset = byte_position (delta_field); else - return NULL_TREE; + fld_offset = byte_position (ptr_field); + + return tree_int_cst_equal (ref_offset, fld_offset) ? rec : NULL_TREE; } /* If STMT looks like a statement loading a value from a member pointer formal @@ -999,8 +1003,8 @@ ipa_note_param_call (struct cgraph_node *node, int param_index, gimple stmt, below, the call is on the last line: <bb 2>: - f$__delta_5 = f.__delta; - f$__pfn_24 = f.__pfn; + f$__delta_5 = MEM[(struct *)&f]; + f$__pfn_24 = MEM[(struct *)&f + 4B]; ... |