diff options
author | Richard Biener <rguenth@gcc.gnu.org> | 2010-09-06 12:14:02 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-09-06 12:14:02 +0000 |
commit | 863a75787c5765257e516afa538dee2e22d6d0ad (patch) | |
tree | 1765fb79bc548e1699fbc45453b13b5b56626b96 /gcc/tree-ssa-address.c | |
parent | 84f47d20bbdf810c4c0643b9980cd9bc57d4d296 (diff) | |
download | gcc-863a75787c5765257e516afa538dee2e22d6d0ad.zip gcc-863a75787c5765257e516afa538dee2e22d6d0ad.tar.gz gcc-863a75787c5765257e516afa538dee2e22d6d0ad.tar.bz2 |
re PR middle-end/45534 (ICE in refs_may_alias_p_1, at tree-ssa-alias.c:1031)
2010-09-06 Richard Guenther <rguenther@suse.de>
PR tree-optimization/45534
* tree-ssa-address.c (create_mem_ref_raw): Add verify parameter.
(create_mem_ref): Do verify the created TARGET_MEM_REF is valid
on the target.
(maybe_fold_tmr): Do not verify the created TARGET_MEM_REF is
valid on the target.
From-SVN: r163913
Diffstat (limited to 'gcc/tree-ssa-address.c')
-rw-r--r-- | gcc/tree-ssa-address.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/gcc/tree-ssa-address.c b/gcc/tree-ssa-address.c index 18c0e55..a9ca835 100644 --- a/gcc/tree-ssa-address.c +++ b/gcc/tree-ssa-address.c @@ -324,14 +324,16 @@ valid_mem_ref_p (enum machine_mode mode, addr_space_t as, /* Checks whether a TARGET_MEM_REF with type TYPE and parameters given by ADDR is valid on the current target and if so, creates and returns the - TARGET_MEM_REF. */ + TARGET_MEM_REF. If VERIFY is false omit the verification step. */ static tree -create_mem_ref_raw (tree type, tree alias_ptr_type, struct mem_address *addr) +create_mem_ref_raw (tree type, tree alias_ptr_type, struct mem_address *addr, + bool verify) { tree base, index2; - if (!valid_mem_ref_p (TYPE_MODE (type), TYPE_ADDR_SPACE (type), addr)) + if (verify + && !valid_mem_ref_p (TYPE_MODE (type), TYPE_ADDR_SPACE (type), addr)) return NULL_TREE; if (addr->step && integer_onep (addr->step)) @@ -689,7 +691,7 @@ create_mem_ref (gimple_stmt_iterator *gsi, tree type, aff_tree *addr, addr_to_parts (type, addr, iv_cand, base_hint, &parts, speed); gimplify_mem_ref_parts (gsi, &parts); - mem_ref = create_mem_ref_raw (type, alias_ptr_type, &parts); + mem_ref = create_mem_ref_raw (type, alias_ptr_type, &parts, true); if (mem_ref) return mem_ref; @@ -705,7 +707,7 @@ create_mem_ref (gimple_stmt_iterator *gsi, tree type, aff_tree *addr, true, NULL_TREE, true, GSI_SAME_STMT); parts.step = NULL_TREE; - mem_ref = create_mem_ref_raw (type, alias_ptr_type, &parts); + mem_ref = create_mem_ref_raw (type, alias_ptr_type, &parts, true); if (mem_ref) return mem_ref; } @@ -740,7 +742,7 @@ create_mem_ref (gimple_stmt_iterator *gsi, tree type, aff_tree *addr, parts.base = tmp; parts.symbol = NULL_TREE; - mem_ref = create_mem_ref_raw (type, alias_ptr_type, &parts); + mem_ref = create_mem_ref_raw (type, alias_ptr_type, &parts, true); if (mem_ref) return mem_ref; } @@ -761,7 +763,7 @@ create_mem_ref (gimple_stmt_iterator *gsi, tree type, aff_tree *addr, parts.base = parts.index; parts.index = NULL_TREE; - mem_ref = create_mem_ref_raw (type, alias_ptr_type, &parts); + mem_ref = create_mem_ref_raw (type, alias_ptr_type, &parts, true); if (mem_ref) return mem_ref; } @@ -783,7 +785,7 @@ create_mem_ref (gimple_stmt_iterator *gsi, tree type, aff_tree *addr, parts.offset = NULL_TREE; - mem_ref = create_mem_ref_raw (type, alias_ptr_type, &parts); + mem_ref = create_mem_ref_raw (type, alias_ptr_type, &parts, true); if (mem_ref) return mem_ref; } @@ -899,10 +901,12 @@ maybe_fold_tmr (tree ref) if (!changed) return NULL_TREE; - ret = create_mem_ref_raw (TREE_TYPE (ref), TREE_TYPE (addr.offset), &addr); - if (!ret) - return NULL_TREE; - + /* If we have propagated something into this TARGET_MEM_REF and thus + ended up folding it, always create a new TARGET_MEM_REF regardless + if it is valid in this for on the target - the propagation result + wouldn't be anyway. */ + ret = create_mem_ref_raw (TREE_TYPE (ref), + TREE_TYPE (addr.offset), &addr, false); copy_mem_ref_info (ret, ref); return ret; } |