Consider this example (derived from gcc.c-torture/execute/920726-1.c):

  extern int a(int a, int b, int c, int d, int e, int f, const char *s1, const 
char *s2) __attribute__((pure));

  int
  foo()
  {
    if (a(0,0,0,0,0,0,"abc","def") || a(0,0,0,0,0,0,"abc","ghi"))
      return 0;
    return 1;
  }

On rl78-elf I'm seeing a bug that only happens if a() is declared
"pure".  When the bug triggers, the address of "abc" in the second
call is *not* written to the stack.  Instead, the move is deleted by
DCE in postreload.  It's not deleted if you remove the "pure".  The
bug was exposed when strcmp() became able to increment incoming stack
arguments in-place, instead of copying them to registers.

The example was intended to reproduce the bug on intel or arm, but it
doesn't.  If there's an obvious fix for this, I'm all ears, but...

The real question is: are stack arguments call-clobbered or
call-preserved?  Does the answer depend on the "pure" attribute?

Reply via email to