/* PR target/85095 *
/* { dg-do compile } */
/* { dg-options "-O2 -masm=att" } */

unsigned int
f1 (unsigned int a, unsigned int b)
{
  unsigned int i = __builtin_add_overflow (a, b, &a);
  return a + i;
}

unsigned int
f2 (unsigned int a, unsigned int b)
{
  unsigned int i = __builtin_add_overflow (a, b, &a);
  return a - i;
}

#ifdef __x86_64__
unsigned long long
f3 (unsigned long long a, unsigned long long b)
{
  unsigned long long i = __builtin_add_overflow (a, b, &a);
  return a + i;
}

unsigned long long
f4 (unsigned long long a, unsigned long long b)
{
  unsigned long long i = __builtin_add_overflow (a, b, &a);
  return a - i;
}

unsigned long long
f5 (unsigned int a, unsigned int b)
{
  unsigned int i = __builtin_add_overflow (a, b, &a);
  return a + i;
}

unsigned long long
f6 (unsigned int a, unsigned int b)
{
  unsigned int i = __builtin_add_overflow (a, b, &a);
  return a - i;
}
#endif

/* { dg-final { scan-assembler-times "adcl\t\\\$0," 1 { target ia32 } } } */
/* { dg-final { scan-assembler-times "sbbl\t\\\$0," 1 { target ia32 } } } */
/* { dg-final { scan-assembler-times "adcl\t\\\$0," 2 { target { ! ia32 } } } } */
/* { dg-final { scan-assembler-times "sbbl\t\\\$0," 2 { target { ! ia32 } } } } */
/* { dg-final { scan-assembler-times "adcq\t\\\$0," 1 { target { ! ia32 } } } } */
/* { dg-final { scan-assembler-times "sbbq\t\\\$0," 1 { target { ! ia32 } } } } */