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.