1 /* Testcase derived from 20111227-1.c to ensure that REE is combining
2    redundant sign extends with sign extend to wider mode.  */
3 /* { dg-options "-fdump-rtl-ree -O" } */
4 
5 extern void abort (void);
6 
7 signed short s;
8 signed int i;
9 signed long l;
10 signed char v = -1;
11 
12 void __attribute__((noinline,noclone))
bar(int t)13 bar (int t)
14 {
15   if (t == 2 && s != -1)
16     abort ();
17   if (t == 1 && i != -1)
18     abort ();
19   if (t == 0 && l != -1)
20     abort ();
21 }
22 
23 void __attribute__((noinline,noclone))
foo(signed char * a,int t)24 foo (signed char *a, int t)
25 {
26   signed char r = v;
27 
28   if (t == 2)
29     s = (signed short) r;
30   else if (t == 1)
31     i = (signed int) r;
32   else if (t == 0)
33     l = (signed long) r;
34   bar (t);
35 }
36 
main(void)37 int main(void)
38 {
39   foo (&v, 0);
40   foo (&v, 1);
41   foo (&v, 2);
42   return 0;
43 }
44 /* { dg-final { scan-rtl-dump "Elimination opportunities = 3 realized = 3" "ree" } }  */
45 /* { dg-final { cleanup-rtl-dump "ree" } }  */
46