[PATCH] Fix PR85863

Richard Biener rguenther@suse.de
Tue May 22 10:28:00 GMT 2018


The following fixes mishandling of widening invariant comparisons
in vect_is_simple_cond which isn't supported for SLP code generation.

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

Richard.

2018-05-22  Richard Biener  <rguenther@suse.de>

        PR tree-optimization/85863
        * tree-vect-stmts.c (vect_is_simple_cond): Only widen invariant
        comparisons when vectype is specified.
        (vectorizable_condition): Do not specify vectype for
        vect_is_simple_cond when SLP vectorizing.

        * gfortran.fortran-torture/compile/pr85863.f: New testcase.


Index: gcc/tree-vect-stmts.c
===================================================================
--- gcc/tree-vect-stmts.c	(revision 260499)
+++ gcc/tree-vect-stmts.c	(working copy)
@@ -8661,7 +8661,7 @@ vect_is_simple_cond (tree cond, vec_info
 
   *comp_vectype = vectype1 ? vectype1 : vectype2;
   /* Invariant comparison.  */
-  if (! *comp_vectype)
+  if (! *comp_vectype && vectype)
     {
       tree scalar_type = TREE_TYPE (lhs);
       /* If we can widen the comparison to match vectype do so.  */
@@ -8773,7 +8773,7 @@ vectorizable_condition (gimple *stmt, gi
   else_clause = gimple_assign_rhs3 (stmt);
 
   if (!vect_is_simple_cond (cond_expr, stmt_info->vinfo,
-			    &comp_vectype, &dts[0], vectype)
+			    &comp_vectype, &dts[0], slp_node ? NULL : vectype)
       || !comp_vectype)
     return false;
 
Index: gcc/testsuite/gfortran.fortran-torture/compile/pr85863.f
===================================================================
--- gcc/testsuite/gfortran.fortran-torture/compile/pr85863.f	(nonexistent)
+++ gcc/testsuite/gfortran.fortran-torture/compile/pr85863.f	(working copy)
@@ -0,0 +1,22 @@
+! { dg-do compile }
+! { dg-additional-options "-ffast-math -ftree-vectorize" }
+      SUBROUTINE SOBOOK(MHSO,HSOMAX,MS)
+      IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+      COMPLEX*16 HSOT,HSO1(2)
+      PARAMETER (ZERO=0.0D+00,TWO=2.0D+00)
+      DIMENSION SOL1(3,2),SOL2(3)
+      CALL FOO(SOL1,SOL2)
+      SQRT2=SQRT(TWO)
+      DO IH=1,MHSO
+        IF(MS.EQ.0) THEN
+          HSO1(IH) =  DCMPLX(ZERO,-SOL1(3,IH))
+          HSOT =  DCMPLX(ZERO,-SOL2(3))
+        ELSE
+          HSO1(IH) =  DCMPLX(-SOL1(2,IH),SOL1(1,IH))/SQRT2
+          HSOT =  DCMPLX(-SOL2(2),SOL2(1))/SQRT2
+        ENDIF
+      ENDDO
+      HSOT=HSOT+HSO1(1)
+      HSOMAX=MAX(HSOMAX,ABS(HSOT))
+      RETURN
+      END



More information about the Gcc-patches mailing list