This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]