1/* PR target/6838 from cato@df.lth.se. 2 cris-elf got an ICE with -O2: the insn matching 3 (insn 49 48 52 (parallel[ 4 (set (mem/s:HI (plus:SI (reg/v/f:SI 0 r0 [24]) 5 (const_int 8 [0x8])) [5 <variable>.c+0 S2 A8]) 6 (reg:HI 2 r2 [27])) 7 (set (reg/f:SI 2 r2 [31]) 8 (plus:SI (reg/v/f:SI 0 r0 [24]) 9 (const_int 8 [0x8]))) 10 ] ) 24 {*mov_sidehi_mem} (nil) 11 (nil)) 12 forced a splitter through the output pattern "#", but there was no 13 matching splitter. */ 14 15struct xx 16 { 17 int a; 18 struct xx *b; 19 short c; 20 }; 21 22int f1 (struct xx *); 23void f2 (void); 24 25int 26foo (struct xx *p, int b, int c, int d) 27{ 28 int a; 29 30 for (;;) 31 { 32 a = f1(p); 33 if (a) 34 return (0); 35 if (b) 36 continue; 37 p->c = d; 38 if (p->a) 39 f2 (); 40 if (c) 41 f2 (); 42 d = p->c; 43 switch (a) 44 { 45 case 1: 46 if (p->b) 47 f2 (); 48 if (c) 49 f2 (); 50 default: 51 break; 52 } 53 } 54 return d; 55} 56 57int main (void) 58{ 59 struct xx s = {0, &s, 23}; 60 if (foo (&s, 0, 0, 0) != 0 || s.a != 0 || s.b != &s || s.c != 0) 61 abort (); 62 exit (0); 63} 64 65int 66f1 (struct xx *p) 67{ 68 static int beenhere = 0; 69 if (beenhere++ > 1) 70 abort (); 71 return beenhere > 1; 72} 73 74void 75f2 (void) 76{ 77 abort (); 78} 79