aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2008-08-13 16:20:42 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2008-08-13 09:20:42 -0700
commit6cd7942d77ea3017ce217daf9621fadc35fe8f8f (patch)
tree417b7d9431e8a76ff8f86aa88b71d0a3c1031102
parent99f536cc68422955e36cc1a5f590d790f92f8001 (diff)
downloadgcc-6cd7942d77ea3017ce217daf9621fadc35fe8f8f.zip
gcc-6cd7942d77ea3017ce217daf9621fadc35fe8f8f.tar.gz
gcc-6cd7942d77ea3017ce217daf9621fadc35fe8f8f.tar.bz2
re PR middle-end/36701 (unaligned access in gcc.c-torture/execute/complex-7.c)
2008-08-13 H.J. Lu <hongjiu.lu@intel.com> PR middle-end/36701 * expr.c (emit_group_store): Allocate stack temp with the largest alignment when copying from register to stack. From-SVN: r139062
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/expr.c31
2 files changed, 31 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fa88d55..d74b64a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2008-08-13 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR middle-end/36701
+ * expr.c (emit_group_store): Allocate stack temp with the
+ largest alignment when copying from register to stack.
+
2008-08-13 Richard Guenther <rguenther@suse.de>
* tree.h (maybe_fold_offset_to_address): Declare.
diff --git a/gcc/expr.c b/gcc/expr.c
index e61dc61..7cc8783 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -2074,12 +2074,31 @@ emit_group_store (rtx orig_dst, rtx src, tree type ATTRIBUTE_UNUSED, int ssize)
}
else
{
- gcc_assert (bytepos == 0 && XVECLEN (src, 0));
- dest = assign_stack_temp (GET_MODE (dest),
- GET_MODE_SIZE (GET_MODE (dest)), 0);
- emit_move_insn (adjust_address (dest, GET_MODE (tmps[i]), bytepos),
- tmps[i]);
- dst = dest;
+ enum machine_mode dest_mode = GET_MODE (dest);
+ enum machine_mode tmp_mode = GET_MODE (tmps[i]);
+ int dest_size = GET_MODE_SIZE (dest_mode);
+ int tmp_size = GET_MODE_SIZE (tmp_mode);
+
+ gcc_assert (bytepos == 0
+ && XVECLEN (src, 0)
+ && dest_size == tmp_size);
+
+ if (GET_MODE_ALIGNMENT (dest_mode)
+ >= GET_MODE_ALIGNMENT (tmp_mode))
+ {
+ dest = assign_stack_temp (dest_mode, dest_size, 0);
+ emit_move_insn (adjust_address (dest,
+ tmp_mode,
+ bytepos),
+ tmps[i]);
+ dst = dest;
+ }
+ else
+ {
+ dest = assign_stack_temp (tmp_mode, tmp_size, 0);
+ emit_move_insn (dest, tmps[i]);
+ dst = adjust_address (dest, dest_mode, bytepos);
+ }
break;
}
}