------- Comment #17 from jakub at gcc dot gnu dot org 2008-12-19 10:41 ------- Better testcase: /* PR rtl-optimization/38245 */ /* { dg-do run } */ /* { dg-options "-O2" } */
extern int bar (long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long) __attribute__((pure)); struct A { int i, j; union { short s[4]; long long l; }; char pad[512]; } a; void __attribute__((noinline)) foo (void) { a.s[2] = bar (6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21); a.l = 6; } int main (void) { char buf[256]; int i; for (i = 0; i < (int) sizeof buf; i++) buf[i] = i; asm volatile ("" : : "r" (buf) : "memory"); foo (); asm volatile ("" : : "r" (buf) : "memory"); for (i = 0; i < (int) sizeof buf; i++) if (buf[i] != (char) i) __builtin_abort (); return 0; } BTW, e.g. on powerpc64-linux or ia64-linux the stack arguments aren't in CALL_INSN_FUNCTION_USAGE at all, only the register arguments. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38245