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.