https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114732

--- Comment #1 from HaoChen Gui <guihaoc at gcc dot gnu.org> ---
A straightforward test case.  It passes when compiling with O0 and aborts when
compiling with O2.

//test.c
#include <altivec.h>

#define BCD_POS0  12    //  0xC
#define BCD_NEG   13    //  0xD

void abort (void);

vector unsigned char maxbcd (unsigned int sign)
{
  vector unsigned char result;
  int i;

  for (i = 15; i > 0; i--)
    result[i] = 0x99;

  result[0] = 0x9 << 4 | sign;

  return result;
}


__attribute__ ((noinline))
int foo (vector unsigned char a, vector unsigned char b)
{
  return __builtin_vec_bcdsub_ge (a, b, 0) != 1;
}

int main(void)
{
  vector unsigned char a = maxbcd (BCD_POS0);
  vector unsigned char b = maxbcd (BCD_NEG);

  if (foo(a, b))
    abort ();

  return 0;
}

Reply via email to