/* { dg-do run } */
/* { dg-options "-O2 -msave-restore -fomit-frame-pointer" } */

#include <stdlib.h>

__attribute__((noinline)) int g(void) { return 42; }

__attribute__((noinline)) int f(void) {
  asm volatile ("li s0, 0x87654321" ::: "s0");
  return g();
}

int main(void) {
  asm volatile ("li s0, 0x12345678" ::: "s0");

  f();

  long s0;
  asm volatile ("mv %0, s0" : "=r"(s0));

  if (s0 == 0x12345678)
    exit (0);
  else
    abort();
}