aboutsummaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-07-28 10:32:54 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-07-28 10:32:54 +0000
commit3abd6c1abf56fcaf3bc4c9eca06fb4a27a6847dc (patch)
tree24f323c2263a9fb7668117d254c9b2b8744a55e7 /gcc/builtins.c
parentbb801fa63ca424c28279ffcea1129c95b78c9d6e (diff)
downloadgcc-3abd6c1abf56fcaf3bc4c9eca06fb4a27a6847dc.zip
gcc-3abd6c1abf56fcaf3bc4c9eca06fb4a27a6847dc.tar.gz
gcc-3abd6c1abf56fcaf3bc4c9eca06fb4a27a6847dc.tar.bz2
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
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r--gcc/builtins.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 9b6fb10..b20426c 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);
}