From c73e7656f5f64a8ee544270adea13cc39ddae70d Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 21 Jan 2019 14:49:42 +0000 Subject: [PATCH] re PR tree-optimization/88934 (ICE: verify_gimple failed (Error: mismatching comparison operand types)) 2019-01-21 Richard Biener PR tree-optimization/88934 * tree-vect-slp.c (vect_mask_constant_operand_p): Always look at the possibly non-constant operand. (vect_get_constant_vectors): Adjust. * gfortran.dg/pr88934.f90: New testcase. From-SVN: r268115 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/pr88934.f90 | 23 +++++++++++++++++++++++ gcc/tree-vect-slp.c | 16 +++++----------- 4 files changed, 40 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/pr88934.f90 diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6fbfef4854b..f785a4a9d17 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2019-01-21 Richard Biener + + PR tree-optimization/88934 + * tree-vect-slp.c (vect_mask_constant_operand_p): Always look + at the possibly non-constant operand. + (vect_get_constant_vectors): Adjust. + 2019-01-21 H.J. Lu PR target/71659 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a629dcdd84b..3518747ee7b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-01-21 Richard Biener + + PR tree-optimization/88934 + * gfortran.dg/pr88934.f90: New testcase. + 2019-01-20 Ulrich Drepper Fix after C++ P0600 implementation. diff --git a/gcc/testsuite/gfortran.dg/pr88934.f90 b/gcc/testsuite/gfortran.dg/pr88934.f90 new file mode 100644 index 00000000000..7c76911b016 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr88934.f90 @@ -0,0 +1,23 @@ +! { dg-do compile } +! { dg-options "-O -ftree-vectorize" } +! { dg-additional-options "-mvsx" { target powerpc*-*-* } } +integer, parameter :: a=3 + integer , dimension(a,a) :: b + logical, dimension(a,a) :: c + do i=0,1 + b = ltoi(c) + do j=0,if + if (anymatmul(b) /= 0) then + end if + end do + end do +contains + elemental function ltoi(d) + logical, intent(in) :: d + if (d) then + ltoi = 1 + else + ltoi = 0 + end if + end +end diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 0e15087df98..40db1a208f1 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -3109,25 +3109,21 @@ vect_slp_bb (basic_block bb) } -/* Return 1 if vector type of boolean constant which is OPNUM - operand in statement STMT_VINFO is a boolean vector. */ +/* Return 1 if vector type STMT_VINFO is a boolean vector. */ static bool -vect_mask_constant_operand_p (stmt_vec_info stmt_vinfo, int opnum) +vect_mask_constant_operand_p (stmt_vec_info stmt_vinfo) { enum tree_code code = gimple_expr_code (stmt_vinfo->stmt); tree op, vectype; enum vect_def_type dt; /* For comparison and COND_EXPR type is chosen depending - on the other comparison operand. */ + on the non-constant other comparison operand. */ if (TREE_CODE_CLASS (code) == tcc_comparison) { gassign *stmt = as_a (stmt_vinfo->stmt); - if (opnum) - op = gimple_assign_rhs1 (stmt); - else - op = gimple_assign_rhs2 (stmt); + op = gimple_assign_rhs1 (stmt); if (!vect_is_simple_use (op, stmt_vinfo->vinfo, &dt, &vectype)) gcc_unreachable (); @@ -3142,8 +3138,6 @@ vect_mask_constant_operand_p (stmt_vec_info stmt_vinfo, int opnum) if (TREE_CODE (cond) == SSA_NAME) op = cond; - else if (opnum) - op = TREE_OPERAND (cond, 1); else op = TREE_OPERAND (cond, 0); @@ -3302,7 +3296,7 @@ vect_get_constant_vectors (tree op, slp_tree slp_node, /* Check if vector type is a boolean vector. */ if (VECT_SCALAR_BOOLEAN_TYPE_P (TREE_TYPE (op)) - && vect_mask_constant_operand_p (stmt_vinfo, op_num)) + && vect_mask_constant_operand_p (stmt_vinfo)) vector_type = build_same_sized_truth_vector_type (STMT_VINFO_VECTYPE (stmt_vinfo)); else -- 2.30.2