[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