This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix part of PR45678
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 17 Sep 2010 10:48:02 +0200 (CEST)
- Subject: [PATCH] Fix part of PR45678
This fixes part of PR45678 where memcpy folding lies about alignment
of memory accesses. Usually this shouldn't matter for !STRICT_ALIGNMENT
targets but some targets are half strict-alignment but lie about that
(x86_64 for example, where all vector modes require strict alignment).
For those targets we require that they implement a movmisalign
optab for the affected modes.
Bootstrapped and tested on x86_64-unknown-linux-gnu, committed.
Richard.
2010-09-17 Richard Guenther <rguenther@suse.de>
PR middle-end/45678
* builtins.c (fold_builtin_memory_op): Always properly adjust
alignment of memory accesses.
Index: gcc/builtins.c
===================================================================
*** gcc/builtins.c (revision 164333)
--- gcc/builtins.c (working copy)
*************** fold_builtin_memory_op (location_t loc,
*** 8555,8566 ****
STRIP_NOPS (srcvar);
if (TREE_CODE (srcvar) == ADDR_EXPR
&& var_decl_component_p (TREE_OPERAND (srcvar, 0))
! && tree_int_cst_equal (TYPE_SIZE_UNIT (srctype), len)
! && (!STRICT_ALIGNMENT
! || !destvar
! || src_align >= TYPE_ALIGN (desttype)))
! srcvar = fold_build2 (MEM_REF, destvar ? desttype : srctype,
! srcvar, off0);
else
srcvar = NULL_TREE;
--- 8555,8575 ----
STRIP_NOPS (srcvar);
if (TREE_CODE (srcvar) == ADDR_EXPR
&& var_decl_component_p (TREE_OPERAND (srcvar, 0))
! && tree_int_cst_equal (TYPE_SIZE_UNIT (srctype), len))
! {
! if (!destvar
! || src_align >= TYPE_ALIGN (desttype))
! srcvar = fold_build2 (MEM_REF, destvar ? desttype : srctype,
! srcvar, off0);
! else if (!STRICT_ALIGNMENT)
! {
! srctype = build_aligned_type (TYPE_MAIN_VARIANT (desttype),
! src_align);
! srcvar = fold_build2 (MEM_REF, srctype, srcvar, off0);
! }
! else
! srcvar = NULL_TREE;
! }
else
srcvar = NULL_TREE;
*************** fold_builtin_memory_op (location_t loc,
*** 8569,8587 ****
if (srcvar == NULL_TREE)
{
- if (STRICT_ALIGNMENT
- && src_align < TYPE_ALIGN (desttype))
- return NULL_TREE;
STRIP_NOPS (src);
! srcvar = fold_build2 (MEM_REF, desttype, src, off0);
}
else if (destvar == NULL_TREE)
{
- if (STRICT_ALIGNMENT
- && dest_align < TYPE_ALIGN (srctype))
- return NULL_TREE;
STRIP_NOPS (dest);
! destvar = fold_build2 (MEM_REF, srctype, dest, off0);
}
expr = build2 (MODIFY_EXPR, TREE_TYPE (destvar), destvar, srcvar);
--- 8578,8608 ----
if (srcvar == NULL_TREE)
{
STRIP_NOPS (src);
! if (src_align >= TYPE_ALIGN (desttype))
! srcvar = fold_build2 (MEM_REF, desttype, src, off0);
! else
! {
! if (STRICT_ALIGNMENT)
! return NULL_TREE;
! srctype = build_aligned_type (TYPE_MAIN_VARIANT (desttype),
! src_align);
! srcvar = fold_build2 (MEM_REF, srctype, src, off0);
! }
}
else if (destvar == NULL_TREE)
{
STRIP_NOPS (dest);
! if (dest_align >= TYPE_ALIGN (srctype))
! destvar = fold_build2 (MEM_REF, srctype, dest, off0);
! else
! {
! if (STRICT_ALIGNMENT)
! return NULL_TREE;
! desttype = build_aligned_type (TYPE_MAIN_VARIANT (srctype),
! dest_align);
! destvar = fold_build2 (MEM_REF, desttype, dest, off0);
! }
}
expr = build2 (MODIFY_EXPR, TREE_TYPE (destvar), destvar, srcvar);