1 /* { dg-do compile } */
2 /* { dg-options "-O2 -fdump-tree-original" } */
3 
4 typedef double c_t;
5 typedef int a_t;
f(a_t a1,a_t a2)6 int f(a_t a1, a_t a2) {
7   return (c_t) a1 < (c_t) a2;
8   /* { dg-final { scan-tree-dump "return (<retval> = )?a1 < a2" "original" } } */
9 }
10 
f1(short a,short b)11 void f1(short a, short b)
12 {
13   volatile int s_s;
14   s_s = (float) a < (float) b;
15   /* { dg-final { scan-tree-dump "s_s = a < b" "original" } } */
16 }
17 
f2(unsigned short a,unsigned short b)18 void f2(unsigned short a, unsigned short b)
19 {
20   volatile int us_us;
21   us_us = (float) a < (float) b;
22   /* { dg-final { scan-tree-dump "us_us = a < b" "original" } } */
23 }
24 
25 /* We don't optimize here because neither of integral types is
26    subset of the other.  */
f3(unsigned short a,short b)27 void f3(unsigned short a, short b)
28 {
29   volatile int us_s;
30   us_s = (float) a < (float) b;
31   /* { dg-final { scan-tree-dump "us_s = \\(float\\) a < \\(float\\) b" "original" } } */
32 }
33 
f4(unsigned short a,int b)34 void f4(unsigned short a, int b)
35 {
36   volatile int us_i;
37   us_i = (double) a < (double) b;
38   /* { dg-final { scan-tree-dump "us_i = \\(int\\) a < b" "original" { target { ! short_eq_int } } } } */
39 }
40 
f4_short_eq_int(unsigned short a,long b)41 void f4_short_eq_int(unsigned short a, long b)
42 {
43   volatile long us_l;
44   us_l = (double) a < (double) b;
45   /* { dg-final { scan-tree-dump "us_l = \\(long int\\) a < b" "original" { target { short_eq_int } } } } */
46 }
47 
48 /* We don't optimize here because neither of integral types is
49    subset of the other.  */
f5(short a,unsigned int b)50 void f5(short a, unsigned int b)
51 {
52   volatile int s_ui;
53   s_ui = (double) a < (double) b;
54   /* { dg-final { scan-tree-dump "s_ui = \\(double\\) a < \\(double\\) b" "original" } } */
55 }
56