diff options
author | Richard Biener <rguenther@suse.de> | 2019-11-29 19:54:25 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-11-29 19:54:25 +0000 |
commit | d005f61e7a0dbb2c991f13b4b61b1a27ca2d8b73 (patch) | |
tree | b81bd53d5b8ffaad0acdf0605109ada9cc2737df /gcc/tree-vect-slp.c | |
parent | 24cc0de967b57f7d1d911921e4cd5332b039380a (diff) | |
download | gcc-d005f61e7a0dbb2c991f13b4b61b1a27ca2d8b73.zip gcc-d005f61e7a0dbb2c991f13b4b61b1a27ca2d8b73.tar.gz gcc-d005f61e7a0dbb2c991f13b4b61b1a27ca2d8b73.tar.bz2 |
re PR fortran/91003 (ICE when compiling LAPACK (CGEGV) with optimization)
2019-11-29 Richard Biener <rguenther@suse.de>
PR tree-optimization/91003
* tree-vect-slp.c (vect_mask_constant_operand_p): Pass in the
operand number, avoid handling the non-condition operands of
COND_EXPRs as comparisons.
(vect_get_constant_vectors): Pass down the operand number.
(vect_get_slp_defs): Likewise.
* gfortran.dg/pr91003.f90: New testcase.
From-SVN: r278860
Diffstat (limited to 'gcc/tree-vect-slp.c')
-rw-r--r-- | gcc/tree-vect-slp.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 0d420e4..e35cb73 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -3447,7 +3447,7 @@ vect_slp_bb (basic_block bb) /* Return 1 if vector type STMT_VINFO is a boolean vector. */ static bool -vect_mask_constant_operand_p (stmt_vec_info stmt_vinfo) +vect_mask_constant_operand_p (stmt_vec_info stmt_vinfo, unsigned op_num) { enum tree_code code = gimple_expr_code (stmt_vinfo->stmt); tree op, vectype; @@ -3472,9 +3472,17 @@ vect_mask_constant_operand_p (stmt_vec_info stmt_vinfo) tree cond = gimple_assign_rhs1 (stmt); if (TREE_CODE (cond) == SSA_NAME) - op = cond; + { + if (op_num > 0) + return VECTOR_BOOLEAN_TYPE_P (STMT_VINFO_VECTYPE (stmt_vinfo)); + op = cond; + } else - op = TREE_OPERAND (cond, 0); + { + if (op_num > 1) + return VECTOR_BOOLEAN_TYPE_P (STMT_VINFO_VECTYPE (stmt_vinfo)); + op = TREE_OPERAND (cond, 0); + } if (!vect_is_simple_use (op, stmt_vinfo->vinfo, &dt, &vectype)) gcc_unreachable (); @@ -3605,9 +3613,10 @@ duplicate_and_interleave (vec_info *vinfo, gimple_seq *seq, tree vector_type, operands. */ static void -vect_get_constant_vectors (slp_tree op_node, slp_tree slp_node, +vect_get_constant_vectors (slp_tree slp_node, unsigned op_num, vec<tree> *vec_oprnds) { + slp_tree op_node = SLP_TREE_CHILDREN (slp_node)[op_num]; stmt_vec_info stmt_vinfo = SLP_TREE_SCALAR_STMTS (slp_node)[0]; vec_info *vinfo = stmt_vinfo->vinfo; unsigned HOST_WIDE_INT nunits; @@ -3629,7 +3638,7 @@ vect_get_constant_vectors (slp_tree op_node, slp_tree slp_node, /* Check if vector type is a boolean vector. */ tree stmt_vectype = STMT_VINFO_VECTYPE (stmt_vinfo); if (VECT_SCALAR_BOOLEAN_TYPE_P (TREE_TYPE (op)) - && vect_mask_constant_operand_p (stmt_vinfo)) + && vect_mask_constant_operand_p (stmt_vinfo, op_num)) vector_type = truth_type_for (stmt_vectype); else vector_type = get_vectype_for_scalar_type (vinfo, TREE_TYPE (op), op_node); @@ -3862,7 +3871,7 @@ vect_get_slp_defs (slp_tree slp_node, vec<vec<tree> > *vec_oprnds, unsigned n) vect_get_slp_vect_defs (child, &vec_defs); } else - vect_get_constant_vectors (child, slp_node, &vec_defs); + vect_get_constant_vectors (slp_node, i, &vec_defs); vec_oprnds->quick_push (vec_defs); } |