diff mbox series

Fix PR88934

Message ID alpine.LSU.2.20.1901211545090.23386@zhemvz.fhfr.qr
State New
Headers show
Series Fix PR88934 | expand

Commit Message

Richard Biener Jan. 21, 2019, 2:47 p.m. UTC
This fixes PR88934 and makes vect_mask_constant_operand_p a little
bit more sensible by consistently looking at the first comparison
operand rather than a different one depending on whether this is
a COND_EXPR vs. a tcc_comparison one.

The first one happens to be non-constant if any is.  We'll still
fail miserably if one is invariant and the other is not.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2019-01-21  Richard Biener  <rguenther@suse.de>

	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.
diff mbox series

Patch

Index: gcc/tree-vect-slp.c
===================================================================
--- gcc/tree-vect-slp.c	(revision 268110)
+++ gcc/tree-vect-slp.c	(working copy)
@@ -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 <gassign *> (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_i
 
       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_
 
   /* 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
Index: gcc/testsuite/gfortran.dg/pr88934.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr88934.f90	(nonexistent)
+++ gcc/testsuite/gfortran.dg/pr88934.f90	(working copy)
@@ -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