diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-09-01 13:57:10 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-09-01 13:57:10 +0200 |
commit | 9151048d854e352a9b83b771c6711b8221c73f7e (patch) | |
tree | a1001271e1322a0404e480ee7deeeb91ae45159d /gcc/optabs.c | |
parent | d1e2e50a5f4d077eab6d3c93047203d15f16b324 (diff) | |
download | gcc-9151048d854e352a9b83b771c6711b8221c73f7e.zip gcc-9151048d854e352a9b83b771c6711b8221c73f7e.tar.gz gcc-9151048d854e352a9b83b771c6711b8221c73f7e.tar.bz2 |
re PR middle-end/91623 (-msse4.1 -O3 segfault in /usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/include/smmintrin.h:270:10)
PR middle-end/91623
* optabs.c (expand_vec_cond_expr): If op0 is a VECTOR_CST and only
EQ_EXPR/NE_EXPR is supported, verify that op0 only contains
zeros or negative elements and use NE_EXPR instead of LT_EXPR against
zero vector.
* gcc.target/i386/pr91623.c: New test.
From-SVN: r275267
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r-- | gcc/optabs.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c index 9e54dda..cdd07f3 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -5868,6 +5868,25 @@ expand_vec_cond_expr (tree vec_cond_type, tree op0, tree op1, tree op2, icode = get_vcond_icode (mode, cmp_op_mode, unsignedp); if (icode == CODE_FOR_nothing) { + if (tcode == LT_EXPR + && op0a == op0 + && TREE_CODE (op0) == VECTOR_CST) + { + /* A VEC_COND_EXPR condition could be folded from EQ_EXPR/NE_EXPR + into a constant when only get_vcond_eq_icode is supported. + Verify < 0 and != 0 behave the same and change it to NE_EXPR. */ + unsigned HOST_WIDE_INT nelts; + if (!VECTOR_CST_NELTS (op0).is_constant (&nelts)) + { + if (VECTOR_CST_STEPPED_P (op0)) + return 0; + nelts = vector_cst_encoded_nelts (op0); + } + for (unsigned int i = 0; i < nelts; ++i) + if (tree_int_cst_sgn (vector_cst_elt (op0, i)) == 1) + return 0; + tcode = NE_EXPR; + } if (tcode == EQ_EXPR || tcode == NE_EXPR) icode = get_vcond_eq_icode (mode, cmp_op_mode); if (icode == CODE_FOR_nothing) |