Fix PR91003

Message ID nycvar.YFH.7.76.1911292052480.5566@zhemvz.fhfr.qr
State New
Headers show
Series
  • Fix PR91003
Related show

Commit Message

Richard Biener Nov. 29, 2019, 7:53 p.m.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

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.

Patch

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