From 3abd6c1abf56fcaf3bc4c9eca06fb4a27a6847dc Mon Sep 17 00:00:00 2001
From: Richard Guenther <rguenther@suse.de>
Date: Wed, 28 Jul 2010 10:32:54 +0000
Subject: [PATCH] re PR target/44903 (FAIL: gcc.dg/pr35258.c execution test)

2010-07-28  Richard Guenther  <rguenther@suse.de>

	PR middle-end/44903
	* builtins.c (fold_builtin_memory_op): On STRICT_ALIGNMENT
	targets try harder to not generate unaligned accesses.

From-SVN: r162624
---
 gcc/ChangeLog  |  6 ++++++
 gcc/builtins.c | 11 ++++++++++-
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d31aec79a0ad..f2fe41f7a9fc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-07-28  Richard Guenther  <rguenther@suse.de>
+
+	PR middle-end/44903
+	* builtins.c (fold_builtin_memory_op): On STRICT_ALIGNMENT
+	targets try harder to not generate unaligned accesses.
+
 2010-07-28  Maxim Kuvyrkov  <maxim@codesourcery.com>
 
 	PR rtl-optimization/45101
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 9b6fb1033b17..b20426cd784c 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -8474,7 +8474,10 @@ fold_builtin_memory_op (location_t loc, tree dest, tree src,
       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))
+	  && tree_int_cst_equal (TYPE_SIZE_UNIT (srctype), len)
+	  && (!STRICT_ALIGNMENT
+	      || !destvar
+	      || src_align >= (int) TYPE_ALIGN (desttype)))
 	srcvar = fold_build2 (MEM_REF, destvar ? desttype : srctype,
 			      srcvar, off0);
       else
@@ -8485,11 +8488,17 @@ fold_builtin_memory_op (location_t loc, tree dest, tree src,
 
       if (srcvar == NULL_TREE)
 	{
+	  if (STRICT_ALIGNMENT
+	      && src_align < (int) 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 < (int) TYPE_ALIGN (srctype))
+	    return NULL_TREE;
 	  STRIP_NOPS (dest);
 	  destvar = fold_build2 (MEM_REF, srctype, dest, off0);
 	}
-- 
GitLab