aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-address.c
diff options
context:
space:
mode:
authorRichard Biener <rguenth@gcc.gnu.org>2010-09-06 12:14:02 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-09-06 12:14:02 +0000
commit863a75787c5765257e516afa538dee2e22d6d0ad (patch)
tree1765fb79bc548e1699fbc45453b13b5b56626b96 /gcc/tree-ssa-address.c
parent84f47d20bbdf810c4c0643b9980cd9bc57d4d296 (diff)
downloadgcc-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.c28
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;
}