/* PR target/6838 from cato@df.lth.se.
   cris-elf got an ICE with -O2: the insn matching
      (insn 49 48 52 (parallel[ 
		  (set (mem/s:HI (plus:SI (reg/v/f:SI 0 r0 [24])
			      (const_int 8 [0x8])) [5 <variable>.c+0 S2 A8])
		      (reg:HI 2 r2 [27]))
		  (set (reg/f:SI 2 r2 [31])
		      (plus:SI (reg/v/f:SI 0 r0 [24])
			  (const_int 8 [0x8])))
	      ] ) 24 {*mov_sidehi_mem} (nil)
	  (nil))
   forced a splitter through the output pattern "#", but there was no
   matching splitter.  */

/* The ptx assembler appears to clobber 'b' inside foo during the f1 call.
   Reported to nvidia 2016-05-18.  */
/* { dg-skip-if "PTX assembler bug" { nvptx-*-* } { "-O0" } { "" } } */

struct xx
 {
   int a;
   struct xx *b;
   short c;
 };

int f1 (struct xx *);
void f2 (void);

int
foo (struct xx *p, int b, int c, int d)
{
  int a;

  for (;;)
    {
      a = f1(p);
      if (a)
	return (0);
      if (b)
	continue;
      p->c = d;
      if (p->a)
	f2 ();
      if (c)
	f2 ();
      d = p->c;
      switch (a)
	{
	case 1:
	  if (p->b)
	    f2 ();
	  if (c)
	    f2 ();
	default:
	  break;
	}
    }
  return d;
}

int main (void)
{
  struct xx s = {0, &s, 23};
  if (foo (&s, 0, 0, 0) != 0 || s.a != 0 || s.b != &s || s.c != 0)
    abort ();
  exit (0);
}

int
f1 (struct xx *p)
{
  static int beenhere = 0;
  if (beenhere++ > 1)
    abort ();
  return beenhere > 1;
}

void
f2 (void)
{
  abort ();
}
