+2010-09-17 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR middle-end/45678
+ * cfgexpand.c (update_stack_alignment): New.
+ (get_decl_align_unit): Use it.
+ (expand_one_stack_var_at): Call update_stack_alignment.
+
2010-09-17 Richard Guenther <rguenther@suse.de>
* lto-streamer-in.c (lto_input_ts_translation_unit_decl_tree_pointers):
smaller than our cutoff threshold. Used for -Wstack-protector. */
static bool has_short_buffer;
-/* Discover the byte alignment to use for DECL. Ignore alignment
- we can't do with expected alignment of the stack boundary. */
+/* Update stack alignment requirement. */
-static unsigned int
-get_decl_align_unit (tree decl)
+static void
+update_stack_alignment (unsigned int align)
{
- unsigned int align;
-
- align = LOCAL_DECL_ALIGNMENT (decl);
-
- if (align > MAX_SUPPORTED_STACK_ALIGNMENT)
- align = MAX_SUPPORTED_STACK_ALIGNMENT;
-
if (SUPPORTS_STACK_ALIGNMENT)
{
if (crtl->stack_alignment_estimated < align)
crtl->stack_alignment_needed = align;
if (crtl->max_used_stack_slot_alignment < align)
crtl->max_used_stack_slot_alignment = align;
+}
+
+/* Discover the byte alignment to use for DECL. Ignore alignment
+ we can't do with expected alignment of the stack boundary. */
+
+static unsigned int
+get_decl_align_unit (tree decl)
+{
+ unsigned int align;
+
+ align = LOCAL_DECL_ALIGNMENT (decl);
+
+ if (align > MAX_SUPPORTED_STACK_ALIGNMENT)
+ align = MAX_SUPPORTED_STACK_ALIGNMENT;
+
+ update_stack_alignment (align);
return align / BITS_PER_UNIT;
}
if (align == 0 || align > max_align)
align = max_align;
+ update_stack_alignment (align);
DECL_ALIGN (decl) = align;
DECL_USER_ALIGN (decl) = 0;
}
--- /dev/null
+/* { dg-do run } */
+
+typedef float V __attribute__ ((vector_size (16)));
+V g;
+
+int
+main ()
+{
+ float d[4] = { 4, 3, 2, 1 };
+ V e;
+ __builtin_memcpy (&e, &d, sizeof (d));
+ V f = { 5, 15, 25, 35 };
+ e = e * f;
+ g = e;
+ return 0;
+}