[PATCH] Fix PR81529

Richard Biener rguenther@suse.de
Tue Jul 25 13:20:00 GMT 2017


This fixes an oversight in an earlier patch of mine (SLP of inductions).

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

Richard.

2017-07-25  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/81529
	* tree-vect-stmts.c (process_use): Disregard live induction PHIs
	when optimizing backedge uses.

	* gfortran.dg/pr81529.f90: New testcase.

Index: gcc/tree-vect-stmts.c
===================================================================
--- gcc/tree-vect-stmts.c	(revision 250494)
+++ gcc/tree-vect-stmts.c	(working copy)
@@ -581,9 +583,11 @@ process_use (gimple *stmt, tree use, loo
     }
   /* We are also not interested in uses on loop PHI backedges that are
      inductions.  Otherwise we'll needlessly vectorize the IV increment
-     and cause hybrid SLP for SLP inductions.  */
+     and cause hybrid SLP for SLP inductions.  Unless the PHI is live
+     of course.  */
   else if (gimple_code (stmt) == GIMPLE_PHI
 	   && STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_induction_def
+	   && ! STMT_VINFO_LIVE_P (stmt_vinfo)
 	   && (PHI_ARG_DEF_FROM_EDGE (stmt, loop_latch_edge (bb->loop_father))
 	       == use))
     {

Index: gcc/testsuite/gfortran.dg/pr81529.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr81529.f90	(nonexistent)
+++ gcc/testsuite/gfortran.dg/pr81529.f90	(working copy)
@@ -0,0 +1,32 @@
+! { dg-do compile }
+! { dg-options "-std=gnu -fno-tree-scev-cprop -Ofast" }
+
+subroutine CalcCgr(C,rmax,ordgr_max)
+  integer, intent(in) :: rmax,ordgr_max
+  double complex :: Zadj(2,2), Zadj2(2,2)
+  double complex, intent(out) :: C(0:rmax,0:rmax,0:rmax)
+  double complex, allocatable :: Cexpgr(:,:,:,:)
+  double complex :: Caux
+  integer :: rmaxB,rmaxExp,r,n0,n1,n2,k,l,i,j,m,n,nn
+
+  rmaxB = 2*rmax
+  rmaxExp = rmaxB
+  allocate(Cexpgr(0:rmaxExp/2,0:rmaxExp,0:rmaxExp,0:ordgr_max))
+   
+  rloop: do r=0,rmaxExp/2
+    do n0=r,1,-1
+      do nn=r-n0,0,-1
+        do i=1,2
+          Caux = Caux - Zadj(i,l)
+        end do
+        Cexpgr(n0,0,0,0) = Caux/(2*(nn+1))
+      end do
+    end do
+    do n1=0,r
+      n2 = r-n1
+      if (r.le.rmax) then
+        C(0,n1,n2) = Cexpgr(0,n1,n2,0)
+      end if
+    end do
+  end do rloop
+end subroutine CalcCgr



More information about the Gcc-patches mailing list