annotate gcc/testsuite/gcc.dg/builtin-arith-overflow-1.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* { dg-do run } */
kono
parents:
diff changeset
2 /* { dg-options "-O2 -fdump-tree-optimized -g" } */
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 /* SUB_OVERFLOW should be folded into unsigned subtraction,
kono
parents:
diff changeset
5 because ovf is never used. */
kono
parents:
diff changeset
6 __attribute__((noinline, noclone)) int
kono
parents:
diff changeset
7 fn1 (int x, unsigned int y)
kono
parents:
diff changeset
8 {
kono
parents:
diff changeset
9 int res;
kono
parents:
diff changeset
10 int ovf = __builtin_sub_overflow (x, y, &res);
kono
parents:
diff changeset
11 int res2 = res;
kono
parents:
diff changeset
12 int res3 = res2 - 2;
kono
parents:
diff changeset
13 (void) ovf;
kono
parents:
diff changeset
14 return res;
kono
parents:
diff changeset
15 }
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 /* MUL_OVERFLOW should be folded into unsigned multiplication,
kono
parents:
diff changeset
18 because ovf is never used. */
kono
parents:
diff changeset
19 __attribute__((noinline, noclone)) int
kono
parents:
diff changeset
20 fn2 (signed char x, long int y)
kono
parents:
diff changeset
21 {
kono
parents:
diff changeset
22 short int res;
kono
parents:
diff changeset
23 int ovf = __builtin_mul_overflow (x, y, &res);
kono
parents:
diff changeset
24 int res2 = res;
kono
parents:
diff changeset
25 int res3 = res2 - 2;
kono
parents:
diff changeset
26 (void) ovf;
kono
parents:
diff changeset
27 return res;
kono
parents:
diff changeset
28 }
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 #if __SIZEOF_INT__ > __SIZEOF_SHORT__ && __SIZEOF_INT__ > 1
kono
parents:
diff changeset
31 /* ADD_OVERFLOW should be folded into unsigned addition,
kono
parents:
diff changeset
32 because it never overflows. */
kono
parents:
diff changeset
33 __attribute__((noinline, noclone)) int
kono
parents:
diff changeset
34 fn3 (signed char x, unsigned short y, int *ovf)
kono
parents:
diff changeset
35 {
kono
parents:
diff changeset
36 int res;
kono
parents:
diff changeset
37 *ovf = __builtin_add_overflow (x, y, &res);
kono
parents:
diff changeset
38 return res;
kono
parents:
diff changeset
39 }
kono
parents:
diff changeset
40 #endif
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 /* MUL_OVERFLOW should be folded into unsigned multiplication,
kono
parents:
diff changeset
43 because it never overflows. */
kono
parents:
diff changeset
44 __attribute__((noinline, noclone)) long int
kono
parents:
diff changeset
45 fn4 (long int x, long int y, int *ovf)
kono
parents:
diff changeset
46 {
kono
parents:
diff changeset
47 long int res;
kono
parents:
diff changeset
48 x &= 65535;
kono
parents:
diff changeset
49 y = (y & 65535) - 32768;
kono
parents:
diff changeset
50 *ovf = __builtin_mul_overflow (x, y, &res);
kono
parents:
diff changeset
51 return res;
kono
parents:
diff changeset
52 }
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 #if __SIZEOF_INT__ > 1
kono
parents:
diff changeset
55 /* MUL_OVERFLOW should be folded into unsigned multiplication,
kono
parents:
diff changeset
56 because it always overflows. */
kono
parents:
diff changeset
57 __attribute__((noinline, noclone)) signed char
kono
parents:
diff changeset
58 fn5 (long int x, long int y, int *ovf)
kono
parents:
diff changeset
59 {
kono
parents:
diff changeset
60 signed char res;
kono
parents:
diff changeset
61 x = (x & 63) + (__SCHAR_MAX__ / 4);
kono
parents:
diff changeset
62 y = (y & 3) + 5;
kono
parents:
diff changeset
63 *ovf = __builtin_mul_overflow (x, y, &res);
kono
parents:
diff changeset
64 return res;
kono
parents:
diff changeset
65 }
kono
parents:
diff changeset
66 #endif
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 /* ADD_OVERFLOW should be folded into unsigned additrion,
kono
parents:
diff changeset
69 because it never overflows. */
kono
parents:
diff changeset
70 __attribute__((noinline, noclone)) unsigned char
kono
parents:
diff changeset
71 fn6 (unsigned char x, unsigned char y, int *ovf)
kono
parents:
diff changeset
72 {
kono
parents:
diff changeset
73 unsigned char res;
kono
parents:
diff changeset
74 x = (x & 63) + ((unsigned char) ~0 - 66);
kono
parents:
diff changeset
75 y = (y & 3);
kono
parents:
diff changeset
76 *ovf = __builtin_add_overflow (x, y, &res);
kono
parents:
diff changeset
77 return res;
kono
parents:
diff changeset
78 }
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 /* ADD_OVERFLOW should be folded into unsigned additrion,
kono
parents:
diff changeset
81 because it always overflows. */
kono
parents:
diff changeset
82 __attribute__((noinline, noclone)) unsigned char
kono
parents:
diff changeset
83 fn7 (unsigned char x, unsigned char y, int *ovf)
kono
parents:
diff changeset
84 {
kono
parents:
diff changeset
85 unsigned char res;
kono
parents:
diff changeset
86 x = (x & 15) + ((unsigned char) ~0 - 15);
kono
parents:
diff changeset
87 y = (y & 3) + 16;
kono
parents:
diff changeset
88 *ovf = __builtin_add_overflow (x, y, &res);
kono
parents:
diff changeset
89 return res;
kono
parents:
diff changeset
90 }
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 int
kono
parents:
diff changeset
93 main ()
kono
parents:
diff changeset
94 {
kono
parents:
diff changeset
95 int ovf;
kono
parents:
diff changeset
96 if (fn1 (-10, __INT_MAX__) != (int) (-10U - __INT_MAX__)
kono
parents:
diff changeset
97 || fn2 (0, 0) != 0
kono
parents:
diff changeset
98 || fn2 (32, 16383) != (short int) 524256ULL)
kono
parents:
diff changeset
99 __builtin_abort ();
kono
parents:
diff changeset
100 #if __SIZEOF_INT__ > __SIZEOF_SHORT__ && __SIZEOF_INT__ > 1
kono
parents:
diff changeset
101 if (fn3 (__SCHAR_MAX__, (unsigned short) ~0, &ovf) != (int) (__SCHAR_MAX__ + (unsigned short) ~0)
kono
parents:
diff changeset
102 || ovf
kono
parents:
diff changeset
103 || fn3 (-__SCHAR_MAX__ - 1, 0, &ovf) != (int) (-__SCHAR_MAX__ - 1)
kono
parents:
diff changeset
104 || ovf)
kono
parents:
diff changeset
105 __builtin_abort ();
kono
parents:
diff changeset
106 #endif
kono
parents:
diff changeset
107 if (fn4 (65535, 0, &ovf) != 65535L * -32768 || ovf)
kono
parents:
diff changeset
108 __builtin_abort ();
kono
parents:
diff changeset
109 #if __SIZEOF_INT__ > 1
kono
parents:
diff changeset
110 if (fn5 (0, 0, &ovf) != (signed char) (__SCHAR_MAX__ / 4 * 5)
kono
parents:
diff changeset
111 || !ovf
kono
parents:
diff changeset
112 || fn5 (63, 3, &ovf) != (signed char) ((__SCHAR_MAX__ / 4 + 63) * 8)
kono
parents:
diff changeset
113 || !ovf)
kono
parents:
diff changeset
114 __builtin_abort ();
kono
parents:
diff changeset
115 #endif
kono
parents:
diff changeset
116 if (fn6 (0, 0, &ovf) != (unsigned char) ~0 - 66
kono
parents:
diff changeset
117 || ovf
kono
parents:
diff changeset
118 || fn6 (63, 3, &ovf) != (unsigned char) ~0
kono
parents:
diff changeset
119 || ovf)
kono
parents:
diff changeset
120 __builtin_abort ();
kono
parents:
diff changeset
121 if (fn7 (0, 0, &ovf) != 0
kono
parents:
diff changeset
122 || !ovf
kono
parents:
diff changeset
123 || fn7 (63, 3, &ovf) != 18
kono
parents:
diff changeset
124 || !ovf)
kono
parents:
diff changeset
125 __builtin_abort ();
kono
parents:
diff changeset
126 return 0;
kono
parents:
diff changeset
127 }
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 /* { dg-final { scan-tree-dump-not "ADD_OVERFLOW" "optimized" } } */
kono
parents:
diff changeset
130 /* { dg-final { scan-tree-dump-not "SUB_OVERFLOW" "optimized" } } */
kono
parents:
diff changeset
131 /* { dg-final { scan-tree-dump-not "MUL_OVERFLOW" "optimized" } } */