Commit d005f61e by Richard Biener Committed by Richard Biener

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
parent 24cc0de9
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.
2019-11-29 Frederik Harwath <frederik@codesourcery.com> 2019-11-29 Frederik Harwath <frederik@codesourcery.com>
* gimple-match-head.c (maybe_resimplify_conditional_op): Use * gimple-match-head.c (maybe_resimplify_conditional_op): Use
2019-11-29 Richard Biener <rguenther@suse.de>
PR tree-optimization/91003
* gfortran.dg/pr91003.f90: New testcase.
2019-11-29 Richard Sandiford <richard.sandiford@arm.com> 2019-11-29 Richard Sandiford <richard.sandiford@arm.com>
PR tree-optimization/92677 PR tree-optimization/92677
......
! { dg-do compile }
! { dg-options "-Ofast" }
SUBROUTINE FOO(N, A, B, C, D, E, F, G)
COMPLEX A(*)
LOGICAL H
INTEGER G
REAL I, C, J, F, F1, F2, K, E, L, M, B, D
DO JC = 1, N
K = F*REAL(A(JC))
Z = F*AIMAG(A(JC))
H = .FALSE.
L = G
IF(ABS(Z).LT.D .AND. I.GE. MAX(D, B*C, B*J)) THEN
H = .TRUE.
L = (D / F1) / MAX(D, F2*I)
END IF
IF(ABS(K).LT.D .AND. C.GE. MAX(D, B*I, B*J)) THEN
L = MAX(L, (D / F1) / MAX(D, F2*C))
END IF
IF(ABS(E).LT.D .AND. J.GE. MAX(D, B*C, B*I)) THEN
H = .TRUE.
L = MAX(L, (D / BNRM1) / MAX(D, BNRM2*J))
END IF
IF(H) THEN
M = (L*D)*MAX(ABS(K), ABS(Z), ABS(E))
END IF
IF(H) THEN
K = (L*REAL(A(JC)))*F
Z = (L*AIMAG(A(JC)))*F
END IF
A(JC) = CMPLX(K, Z)
END DO
END
...@@ -3447,7 +3447,7 @@ vect_slp_bb (basic_block bb) ...@@ -3447,7 +3447,7 @@ vect_slp_bb (basic_block bb)
/* Return 1 if vector type STMT_VINFO is a boolean vector. */ /* Return 1 if vector type STMT_VINFO is a boolean vector. */
static bool 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); enum tree_code code = gimple_expr_code (stmt_vinfo->stmt);
tree op, vectype; tree op, vectype;
...@@ -3472,9 +3472,17 @@ vect_mask_constant_operand_p (stmt_vec_info stmt_vinfo) ...@@ -3472,9 +3472,17 @@ vect_mask_constant_operand_p (stmt_vec_info stmt_vinfo)
tree cond = gimple_assign_rhs1 (stmt); tree cond = gimple_assign_rhs1 (stmt);
if (TREE_CODE (cond) == SSA_NAME) 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 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)) if (!vect_is_simple_use (op, stmt_vinfo->vinfo, &dt, &vectype))
gcc_unreachable (); gcc_unreachable ();
...@@ -3605,9 +3613,10 @@ duplicate_and_interleave (vec_info *vinfo, gimple_seq *seq, tree vector_type, ...@@ -3605,9 +3613,10 @@ duplicate_and_interleave (vec_info *vinfo, gimple_seq *seq, tree vector_type,
operands. */ operands. */
static void 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) 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]; stmt_vec_info stmt_vinfo = SLP_TREE_SCALAR_STMTS (slp_node)[0];
vec_info *vinfo = stmt_vinfo->vinfo; vec_info *vinfo = stmt_vinfo->vinfo;
unsigned HOST_WIDE_INT nunits; unsigned HOST_WIDE_INT nunits;
...@@ -3629,7 +3638,7 @@ vect_get_constant_vectors (slp_tree op_node, slp_tree slp_node, ...@@ -3629,7 +3638,7 @@ vect_get_constant_vectors (slp_tree op_node, slp_tree slp_node,
/* Check if vector type is a boolean vector. */ /* Check if vector type is a boolean vector. */
tree stmt_vectype = STMT_VINFO_VECTYPE (stmt_vinfo); tree stmt_vectype = STMT_VINFO_VECTYPE (stmt_vinfo);
if (VECT_SCALAR_BOOLEAN_TYPE_P (TREE_TYPE (op)) 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); vector_type = truth_type_for (stmt_vectype);
else else
vector_type = get_vectype_for_scalar_type (vinfo, TREE_TYPE (op), op_node); 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) ...@@ -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); vect_get_slp_vect_defs (child, &vec_defs);
} }
else 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); vec_oprnds->quick_push (vec_defs);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment