diff options
author | Richard Guenther <rguenther@suse.de> | 2009-08-31 12:52:17 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-08-31 12:52:17 +0000 |
commit | e2abde5f35ace69607e6664daa9765f50635ad1d (patch) | |
tree | 07b7dc4c38ed99480adb1d8ac12e3fa86d3742c5 /gcc/builtins.c | |
parent | 2fbd4117c6872453531aa88123f0ea8efdf1b4df (diff) | |
download | gcc-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.c | 58 |
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; } |