@@ -2374,7 +2374,7 @@ expand_call (tree exp, rtx target, int ignore)
preferred_unit_stack_boundary = preferred_stack_boundary / BITS_PER_UNIT;
- if (SUPPORTS_STACK_ALIGNMENT)
+ if (SUPPORTS_STACK_ALIGNMENT && fndecl && !DECL_IS_BUILTIN (fndecl))
{
/* All variable sized adjustments must be multiple of preferred
stack boundary. Stack alignment may change preferred stack
@@ -1443,6 +1443,7 @@ init_block_move_fn (const char *asmspec)
NULL_TREE);
fn = build_decl (FUNCTION_DECL, fn, args);
+ DECL_SOURCE_LOCATION (fn) = UNKNOWN_LOCATION;
DECL_EXTERNAL (fn) = 1;
TREE_PUBLIC (fn) = 1;
DECL_ARTIFICIAL (fn) = 1;
@@ -2713,6 +2714,7 @@ init_block_clear_fn (const char *asmspec)
NULL_TREE);
fn = build_decl (FUNCTION_DECL, fn, args);
+ DECL_SOURCE_LOCATION (fn) = UNKNOWN_LOCATION;
DECL_EXTERNAL (fn) = 1;
TREE_PUBLIC (fn) = 1;
DECL_ARTIFICIAL (fn) = 1;
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-march=i586" { target ilp32 } } */
+
+struct S { union { double b[4]; } a[18]; } s, a[5];
+void foo (struct S);
+struct S bar (struct S, struct S *, struct S);
+
+void
+foo (struct S arg)
+{
+}
+
+void
+baz (void)
+{
+ foo (bar (s, &a[1], a[2]));
+}