1 /* PR target/83210 */
2 /* { dg-do compile } */
3 /* { dg-options "-O2" } */
4 /* { dg-final { scan-assembler-not {\mmul[lq]\M} } } */
5
6 void bar (void);
7
8 unsigned
f1(unsigned int x)9 f1 (unsigned int x)
10 {
11 unsigned res;
12 if (__builtin_mul_overflow (x, 2, &res))
13 bar ();
14 return res;
15 }
16
17 unsigned long
f2(unsigned long x)18 f2 (unsigned long x)
19 {
20 unsigned long res;
21 if (__builtin_mul_overflow (16, x, &res))
22 bar ();
23 return res;
24 }
25
26 unsigned long long
f3(unsigned long long x)27 f3 (unsigned long long x)
28 {
29 unsigned long long res;
30 if (__builtin_mul_overflow (x, (1ULL << (__SIZEOF_LONG_LONG__ * __CHAR_BIT__ - 1)), &res))
31 bar ();
32 return res;
33 }
34
35 #ifdef __SIZEOF_INT128__
36 unsigned __int128
f4(unsigned __int128 x)37 f4 (unsigned __int128 x)
38 {
39 unsigned __int128 res;
40 if (__builtin_mul_overflow (x, (((unsigned __int128) 1) << (__SIZEOF_INT128__ * __CHAR_BIT__ / 2)), &res))
41 bar ();
42 return res;
43 }
44
45 unsigned __int128
f5(unsigned __int128 x)46 f5 (unsigned __int128 x)
47 {
48 unsigned __int128 res;
49 if (__builtin_mul_overflow (x, (((unsigned __int128) 1) << (__SIZEOF_INT128__ * __CHAR_BIT__ / 2 + 3)), &res))
50 bar ();
51 return res;
52 }
53 #endif
54