Hello! For vector modes we have to use vector_operand predicate, which rejects unaligned operands for non-avx targets.
2018-12-10 Uros Bizjak <ubiz...@gmail.com> PR target/88418 * config/i386/i386.c (ix86_expand_sse_cmp): For vector modes, check operand 1 with vector_operand predicate. (ix86_expand_sse_movcc): For vector modes, check op_true with vector_operand, not nonimmediate_operand. testsuite/ChangeLog: 2018-12-10 Uros Bizjak <ubiz...@gmail.com> PR target/88418 * gcc.target/i386/pr88418.c: New test. Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}. Committed to mainline, patch will be backported to release branches. Uros.
Index: config/i386/i386.c =================================================================== --- config/i386/i386.c (revision 266926) +++ config/i386/i386.c (working copy) @@ -23483,7 +23483,7 @@ ix86_expand_sse_fp_minmax (rtx dest, enum rtx_code return true; } -/* Expand an sse vector comparison. Return the register with the result. */ +/* Expand an SSE comparison. Return the register with the result. */ static rtx ix86_expand_sse_cmp (rtx dest, enum rtx_code code, rtx cmp_op0, rtx cmp_op1, @@ -23508,9 +23508,12 @@ ix86_expand_sse_cmp (rtx dest, enum rtx_code code, else cmp_mode = cmp_ops_mode; + cmp_op0 = force_reg (cmp_ops_mode, cmp_op0); - cmp_op0 = force_reg (cmp_ops_mode, cmp_op0); - if (!nonimmediate_operand (cmp_op1, cmp_ops_mode)) + int (*op1_predicate)(rtx, machine_mode) + = VECTOR_MODE_P (cmp_ops_mode) ? vector_operand : nonimmediate_operand; + + if (!op1_predicate (cmp_op1, cmp_ops_mode)) cmp_op1 = force_reg (cmp_ops_mode, cmp_op1); if (optimize @@ -23627,7 +23630,7 @@ ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_t rtx (*gen) (rtx, rtx, rtx, rtx) = NULL; rtx d = dest; - if (!nonimmediate_operand (op_true, mode)) + if (!vector_operand (op_true, mode)) op_true = force_reg (mode, op_true); op_false = force_reg (mode, op_false); Index: testsuite/gcc.target/i386/pr88418.c =================================================================== --- testsuite/gcc.target/i386/pr88418.c (nonexistent) +++ testsuite/gcc.target/i386/pr88418.c (working copy) @@ -0,0 +1,15 @@ +/* PR target/88418 */ +/* { dg-do compile } */ +/* { dg-options "-O1 -fpack-struct -msse4.1" } */ + +typedef long long v2di __attribute__ ((__vector_size__ (16))); + +union df { + v2di se[2]; +}; + +void +qg (union df *jz, union df *pl) +{ + jz->se[0] = jz->se[0] == pl->se[0]; +}