1  /* PR target/93141 */
       2  /* { dg-do compile } */
       3  /* { dg-options "-O2 -masm=att" } */
       4  /* { dg-final { scan-assembler-not "cmp\[lq]\t" } } */
       5  /* { dg-final { scan-assembler-not "adc\[lq]\t" } } */
       6  /* { dg-final { scan-assembler-times "seto\t%" 7 } } */
       7  /* { dg-final { scan-assembler-times "sbb\[lq]\t" 5 } } */
       8  
       9  #ifdef __x86_64__
      10  typedef unsigned __int128 U;
      11  typedef unsigned long long HU;
      12  typedef signed __int128 S;
      13  #else
      14  typedef unsigned long long U;
      15  typedef signed int HU;
      16  typedef signed long long S;
      17  #endif
      18  int o;
      19  
      20  S
      21  qux (S x, S y)
      22  {
      23    S z;
      24    o = __builtin_sub_overflow (x, y, &z);
      25    return z;
      26  }
      27  
      28  S
      29  quux (S x)
      30  {
      31    S z;
      32    o = __builtin_sub_overflow (x, ((S) 0xdeadbee) << (sizeof (S) * __CHAR_BIT__ / 2), &z);
      33    return z;
      34  }
      35  
      36  S
      37  corge (S x)
      38  {
      39    S z;
      40    o = __builtin_sub_overflow (x, (((S) 0xdeadbee) << (sizeof (S) * __CHAR_BIT__ / 2))
      41  				 | (S) 0xbeedead, &z);
      42    return z;
      43  }
      44  
      45  S
      46  grault (S x)
      47  {
      48    S z;
      49    o = __builtin_sub_overflow (x, -((S) 0xdeadbee) << (sizeof (S) * __CHAR_BIT__ / 2), &z);
      50    return z;
      51  }
      52  
      53  S
      54  garply (S x)
      55  {
      56    S z;
      57    o = __builtin_sub_overflow (x, (-(((S) 0xdeadbee) << (sizeof (S) * __CHAR_BIT__ / 2)))
      58  				 | (S) 0xbeedead, &z);
      59    return z;
      60  }
      61  
      62  S
      63  waldo (S x)
      64  {
      65    S z;
      66    o = __builtin_sub_overflow (x, (S) ((((S) 0xdeadbee) << (sizeof (S) * __CHAR_BIT__ / 2))
      67  				      | -(HU) 0xbeedead), &z);
      68    return z;
      69  }
      70  
      71  S
      72  fred (S x)
      73  {
      74    S z;
      75    o = __builtin_sub_overflow (x, (S) ((-(((S) 0xdeadbee) << (sizeof (S) * __CHAR_BIT__ / 2)))
      76  				      | -(HU) 0xbeedead), &z);
      77    return z;
      78  }