[Bug c/126976] New: forwprop introduce the result divergence

kyuwoncho18 at gmail dot com via Gcc-bugs <[email protected]>
Newsgroups gmane.comp.gcc.bugs
Message-ID <[email protected]/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126976

            Bug ID: 126976
           Summary: forwprop introduce the result divergence
           Product: gcc
           Version: 16.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kyuwoncho18 at gmail dot com
  Target Milestone: ---

Created attachment 65380
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=65380&action=edit
same code as I include on description

Consider the code:
#include <stdio.h>

typedef signed char   v8qi  __attribute__((vector_size(8)));
typedef unsigned char v8uqi __attribute__((vector_size(8)));
typedef short         v8hi  __attribute__((vector_size(16)));

__attribute__((noipa))
v8hi f(v8qi A, v8qi B) {
  v8uqi Au = (v8uqi)A;
  v8hi r = { Au[0], Au[1], Au[2], Au[3], B[4], B[5], B[6], B[7] };
  return r;
}

int main(void) {
  v8qi A = { -1, -2, 3, 4, 5, 6, 7, 8 };
  v8qi B = { 10, 20, 30, 40, -50, -60, -70, -128 };
  v8hi r = f(A, B);
  short out[8];
  __builtin_memcpy(out, &r, sizeof out);
  for (int i = 0; i < 8; i++) printf("%d ", out[i]);
  printf("\n");
  return 0;
}

And with O0, it prints "255 254 3 4 -50 -60 -70 -128", but with O2, it prints
"255 254 3 4 206 196 186 128".

Godbolt: https://godbolt.org/z/jj1ba1584
Only affected after GCC 16.1; on 15.3, it can not be reproduced.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.