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

            Bug ID: 70430
           Summary: Incorrect result for logical "and" operation with
                    mixed vector and scalar
           Product: gcc
           Version: 5.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mjh at edg dot com
  Target Milestone: ---

I'm seeing surprising results at run time when mixing a vector and a scalar in
a logical "and" operation:

$ cat foo.C
extern "C" int printf (const char *, ...);
typedef int v4si __attribute__ ((vector_size (16)));
int main() {
  v4si a = {1,1,1,1}, b = {1,0,-1,2}, x = {-1,-1,-1,-1},  z = {0,0,0,0}, c;
  c = a && b;              printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]);
  c = x && b;              printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]);
  c = (v4si){1,1,1,1} && b;printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]);
  c = 1 && b;              printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]);
  c = b && a;              printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]);
  c = b && x;              printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]);
  c = b && (v4si){1,1,1,1};printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]);
  printf("bug:\n");
  c = b && 1;              printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]); //?

  c = z && b;              printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]);
  c = (v4si){0,0,0,0} && b;printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]);
  c = 0 && b;              printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]);
  c = b && z;              printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]);
  c = b && (v4si){0,0,0,0};printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]);
  printf("bug:\n");
  c = b && 0;              printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]); //?

  return 0;
}
$ g++520 foo.C && a.out
-1 0 -1 -1
-1 0 -1 -1
-1 0 -1 -1
-1 0 -1 -1
-1 0 -1 -1
-1 0 -1 -1
-1 0 -1 -1
bug:
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
bug:
-1 0 -1 -1
$

These two cases (i.e., with an initial vector and a subsequent scalar) seem to
give the opposite result of what I would expect.  I didn't check to see if
logical "or" has similar issues.

Reply via email to