The following fixes a not properly aligned stack temporary created
during RTL expansion of a MEM_REF that we handle as a BIT_FIELD_REF
whose base was allocated to a register but which was originally
aligned to allow a larger load not trapping. While probably UB
in C the vectorizer creates aligned accesses that might overread
a (static) allocation because it is then known not to trap.
PR middle-end/118684
* expr.cc (expand_expr_real_1): When expanding a reference
based on a register and we end up needing a MEM make sure
that's aligned as the original reference required.
* gcc.dg/pr118684.c: New testcase.
and need be, put it there. */
else if (CONSTANT_P (op0) || (!MEM_P (op0) && must_force_mem))
{
- memloc = assign_temp (TREE_TYPE (tem), 1, 1);
+ poly_int64 size;
+ if (!poly_int_tree_p (TYPE_SIZE_UNIT (TREE_TYPE (tem)), &size))
+ size = max_int_size_in_bytes (TREE_TYPE (tem));
+ memloc = assign_stack_local (TYPE_MODE (TREE_TYPE (tem)), size,
+ get_object_alignment (tem));
emit_move_insn (memloc, op0);
op0 = memloc;
clear_mem_expr = true;
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+typedef int v4si __attribute__((vector_size(16)));
+v4si x;
+int main ()
+{
+ int b __attribute__((aligned(16)));
+ b = 0;
+ x = *(v4si *)&b;
+ return 0;
+}