Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
Richard. 2019-11-29 Richard Biener <rguent...@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. Index: gcc/tree-vect-slp.c =================================================================== --- gcc/tree-vect-slp.c (revision 278841) +++ gcc/tree-vect-slp.c (working copy) @@ -3477,7 +3477,7 @@ /* 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; @@ -3502,9 +3502,17 @@ 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 (); @@ -3635,9 +3643,10 @@ 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; @@ -3659,7 +3668,7 @@ /* 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); @@ -3892,7 +3901,7 @@ 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); } Index: gcc/testsuite/gfortran.dg/pr91003.f90 =================================================================== --- gcc/testsuite/gfortran.dg/pr91003.f90 (nonexistent) +++ gcc/testsuite/gfortran.dg/pr91003.f90 (working copy) @@ -0,0 +1,33 @@ +! { 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