aboutsummaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-08-31 12:52:17 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-08-31 12:52:17 +0000
commite2abde5f35ace69607e6664daa9765f50635ad1d (patch)
tree07b7dc4c38ed99480adb1d8ac12e3fa86d3742c5 /gcc/builtins.c
parent2fbd4117c6872453531aa88123f0ea8efdf1b4df (diff)
downloadgcc-e2abde5f35ace69607e6664daa9765f50635ad1d.zip
gcc-e2abde5f35ace69607e6664daa9765f50635ad1d.tar.gz
gcc-e2abde5f35ace69607e6664daa9765f50635ad1d.tar.bz2
builtins.c (fold_builtin_memory_op): Use the alias oracle to query if the memory regions for memmove overlap.
2009-08-31 Richard Guenther <rguenther@suse.de> * builtins.c (fold_builtin_memory_op): Use the alias oracle to query if the memory regions for memmove overlap. * tree-ssa-alias.c (ptr_deref_may_alias_decl_p): Relax the asserts on pointers, instead deal with odd trees. (ptr_derefs_may_alias_p): Likewise. (refs_may_alias_p_1): Constructor bases also never alias. From-SVN: r151241
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r--gcc/builtins.c58
1 files changed, 7 insertions, 51 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 1a9e966..ed97d48 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -8990,6 +8990,8 @@ fold_builtin_memory_op (location_t loc, tree dest, tree src,
if (endp == 3)
{
+ ao_ref srcref, destref;
+
src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
dest_align = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
@@ -9012,62 +9014,16 @@ fold_builtin_memory_op (location_t loc, tree dest, tree src,
}
/* If *src and *dest can't overlap, optimize into memcpy as well. */
- srcvar = build_fold_indirect_ref_loc (loc, src);
- destvar = build_fold_indirect_ref_loc (loc, dest);
- if (srcvar
- && !TREE_THIS_VOLATILE (srcvar)
- && destvar
- && !TREE_THIS_VOLATILE (destvar))
+ ao_ref_init_from_ptr_and_size (&srcref, src, len);
+ ao_ref_init_from_ptr_and_size (&destref, dest, len);
+ if (!refs_may_alias_p_1 (&srcref, &destref, false))
{
- tree src_base, dest_base, fn;
- HOST_WIDE_INT src_offset = 0, dest_offset = 0;
- HOST_WIDE_INT size = -1;
- HOST_WIDE_INT maxsize = -1;
-
- src_base = srcvar;
- if (handled_component_p (src_base))
- src_base = get_ref_base_and_extent (src_base, &src_offset,
- &size, &maxsize);
- dest_base = destvar;
- if (handled_component_p (dest_base))
- dest_base = get_ref_base_and_extent (dest_base, &dest_offset,
- &size, &maxsize);
- if (host_integerp (len, 1))
- {
- maxsize = tree_low_cst (len, 1);
- if (maxsize
- > INTTYPE_MAXIMUM (HOST_WIDE_INT) / BITS_PER_UNIT)
- maxsize = -1;
- else
- maxsize *= BITS_PER_UNIT;
- }
- else
- maxsize = -1;
- if (SSA_VAR_P (src_base)
- && SSA_VAR_P (dest_base))
- {
- if (operand_equal_p (src_base, dest_base, 0)
- && ranges_overlap_p (src_offset, maxsize,
- dest_offset, maxsize))
- return NULL_TREE;
- }
- else if (TREE_CODE (src_base) == INDIRECT_REF
- && TREE_CODE (dest_base) == INDIRECT_REF)
- {
- if (! operand_equal_p (TREE_OPERAND (src_base, 0),
- TREE_OPERAND (dest_base, 0), 0)
- || ranges_overlap_p (src_offset, maxsize,
- dest_offset, maxsize))
- return NULL_TREE;
- }
- else
- return NULL_TREE;
-
- fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
+ tree fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
if (!fn)
return NULL_TREE;
return build_call_expr_loc (loc, fn, 3, dest, src, len);
}
+
return NULL_TREE;
}