diff options
author | Richard Guenther <rguenther@suse.de> | 2010-07-28 10:32:54 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-07-28 10:32:54 +0000 |
commit | 3abd6c1abf56fcaf3bc4c9eca06fb4a27a6847dc (patch) | |
tree | 24f323c2263a9fb7668117d254c9b2b8744a55e7 /gcc/builtins.c | |
parent | bb801fa63ca424c28279ffcea1129c95b78c9d6e (diff) | |
download | gcc-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.c | 11 |
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); } |