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; }