1/* { dg-do run } */
2/* { dg-options "-fdump-tree-original" } */
3
4/* Check that MIN-MAX and MAX-MIN combinations are folded.  */
5
6extern void abort (void);
7
8#define MIN(a,b) ((a) < (b) ? (a) : (b))
9#define MAX(a,b) ((a) > (b) ? (a) : (b))
10
11int f1(int a, int b)
12{
13   return MIN (MAX (a, b), b); /* == b */
14}
15
16int f2(int a, int b)
17{
18   return MAX (MIN (a, b), b); /* == b */
19}
20
21int f3(int a, int b)
22{
23   return MIN (MAX (b, a), b); /* == b */
24}
25
26int f4(int a, int b)
27{
28   return MAX (MIN (b, a), b); /* == b */
29}
30
31
32int g1(int a, int b)
33{
34   return MIN (a, MAX (a, b)); /* == a */
35}
36
37int g2(int a, int b)
38{
39   return MAX (a, MIN (a, b)); /* == a */
40}
41
42int g3(int a, int b)
43{
44   return MIN (a, MAX (b, a)); /* == a */
45}
46
47int g4(int a, int b)
48{
49   return MAX (a, MIN (b, a)); /* == a */
50}
51
52int main(void)
53{
54  if (f1 (1, 2) != 2)
55    abort ();
56
57  if (f2 (1, 2) != 2)
58    abort ();
59
60  if (f3 (1, 2) != 2)
61    abort ();
62
63  if (f4 (1, 2) != 2)
64    abort ();
65
66  if (g1 (1, 2) != 1)
67    abort ();
68
69  if (g2 (1, 2) != 1)
70    abort ();
71
72  if (g3 (1, 2) != 1)
73    abort ();
74
75  if (g4 (1, 2) != 1)
76    abort ();
77
78  return 0;
79}
80
81/* { dg-final { scan-tree-dump-times "MIN_EXPR" 0 "original"} } */
82/* { dg-final { scan-tree-dump-times "MAX_EXPR" 0 "original"} } */
83/* { dg-final { cleanup-tree-dump "original" } } */
84