/* PR target/93141 */ /* { dg-do compile } */ /* { dg-options "-O2 -masm=att" } */ /* { dg-final { scan-assembler-not "cmp\[lq]\t" } } */ /* { dg-final { scan-assembler-not "adc\[lq]\t" } } */ /* { dg-final { scan-assembler-times "seto\t%" 7 } } */ /* { dg-final { scan-assembler-times "sbb\[lq]\t" 5 } } */ #ifdef __x86_64__ typedef unsigned __int128 U; typedef unsigned long long HU; typedef signed __int128 S; #else typedef unsigned long long U; typedef signed int HU; typedef signed long long S; #endif int o; S qux (S x, S y) { S z; o = __builtin_sub_overflow (x, y, &z); return z; } S quux (S x) { S z; o = __builtin_sub_overflow (x, ((S) 0xdeadbee) << (sizeof (S) * __CHAR_BIT__ / 2), &z); return z; } S corge (S x) { S z; o = __builtin_sub_overflow (x, (((S) 0xdeadbee) << (sizeof (S) * __CHAR_BIT__ / 2)) | (S) 0xbeedead, &z); return z; } S grault (S x) { S z; o = __builtin_sub_overflow (x, -((S) 0xdeadbee) << (sizeof (S) * __CHAR_BIT__ / 2), &z); return z; } S garply (S x) { S z; o = __builtin_sub_overflow (x, (-(((S) 0xdeadbee) << (sizeof (S) * __CHAR_BIT__ / 2))) | (S) 0xbeedead, &z); return z; } S waldo (S x) { S z; o = __builtin_sub_overflow (x, (S) ((((S) 0xdeadbee) << (sizeof (S) * __CHAR_BIT__ / 2)) | -(HU) 0xbeedead), &z); return z; } S fred (S x) { S z; o = __builtin_sub_overflow (x, (S) ((-(((S) 0xdeadbee) << (sizeof (S) * __CHAR_BIT__ / 2))) | -(HU) 0xbeedead), &z); return z; }