public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-2161] tree-optimization/110451 - hoist invariant compare after interchange
@ 2023-06-28 13:05 Richard Biener
  0 siblings, 0 replies; only message in thread
From: Richard Biener @ 2023-06-28 13:05 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:237e83e2158a3d9b875f8775805d04d97e8b36c1

commit r14-2161-g237e83e2158a3d9b875f8775805d04d97e8b36c1
Author: Richard Biener <rguenther@suse.de>
Date:   Wed Jun 28 13:36:59 2023 +0200

    tree-optimization/110451 - hoist invariant compare after interchange
    
    The following adjusts the cost model of invariant motion to consider
    [VEC_]COND_EXPRs and comparisons producing a data value as expensive.
    For 503.bwaves_r this avoids an unnecessarily high vectorization
    factor because of an integer comparison besides data operations on
    double.
    
            PR tree-optimization/110451
            * tree-ssa-loop-im.cc (stmt_cost): [VEC_]COND_EXPR and
            tcc_comparison are expensive.
    
            * gfortran.dg/vect/pr110451.f: New testcase.

Diff:
---
 gcc/testsuite/gfortran.dg/vect/pr110451.f | 51 +++++++++++++++++++++++++++++++
 gcc/tree-ssa-loop-im.cc                   | 11 ++++++-
 2 files changed, 61 insertions(+), 1 deletion(-)

diff --git a/gcc/testsuite/gfortran.dg/vect/pr110451.f b/gcc/testsuite/gfortran.dg/vect/pr110451.f
new file mode 100644
index 00000000000..ba77b0dd174
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/vect/pr110451.f
@@ -0,0 +1,51 @@
+! { dg-do compile }
+! { dg-require-effective-target vect_condition }
+! { dg-require-effective-target vect_double }
+! { dg-additional-options "-ffast-math -floop-interchange -fdump-tree-linterchange-details -fdump-tree-vect-details" }
+! { dg-additional-options "-mprefer-vector-width=128" { target x86_64-*-* i?86-*-* } }
+
+        subroutine mat_times_vec(y,x,a,axp,ayp,azp,axm,aym,azm,
+     $  nb,nx,ny,nz)
+        implicit none
+        integer nb,nx,ny,nz,i,j,k,m,l,kit,im1,ip1,jm1,jp1,km1,kp1
+
+        real*8 y(nb,nx,ny,nz),x(nb,nx,ny,nz)
+
+        real*8 a(nb,nb,nx,ny,nz),
+     1  axp(nb,nb,nx,ny,nz),ayp(nb,nb,nx,ny,nz),azp(nb,nb,nx,ny,nz),
+     2  axm(nb,nb,nx,ny,nz),aym(nb,nb,nx,ny,nz),azm(nb,nb,nx,ny,nz)
+
+
+      do k=1,nz
+         km1=mod(k+nz-2,nz)+1
+         kp1=mod(k,nz)+1
+         do j=1,ny
+            jm1=mod(j+ny-2,ny)+1
+            jp1=mod(j,ny)+1
+            do i=1,nx
+               im1=mod(i+nx-2,nx)+1
+               ip1=mod(i,nx)+1
+               do l=1,nb
+                  y(l,i,j,k)=0.0d0
+                  do m=1,nb
+                     y(l,i,j,k)=y(l,i,j,k)+
+     1               a(l,m,i,j,k)*x(m,i,j,k)+
+     2               axp(l,m,i,j,k)*x(m,ip1,j,k)+
+     3               ayp(l,m,i,j,k)*x(m,i,jp1,k)+
+     4               azp(l,m,i,j,k)*x(m,i,j,kp1)+
+     5               axm(l,m,i,j,k)*x(m,im1,j,k)+
+     6               aym(l,m,i,j,k)*x(m,i,jm1,k)+
+     7               azm(l,m,i,j,k)*x(m,i,j,km1)
+                  enddo
+               enddo
+            enddo
+         enddo
+        enddo          
+        return
+        end
+
+! loop interchange adds a conditional on m != 1 in the innermost loop
+! verify that is hoisted and thus not affecting the vectorization factor
+
+! { dg-final { scan-tree-dump-times "is interchanged" 1 "linterchange" } }
+! { dg-final { scan-tree-dump "vectorization factor = 2" "vect" { target x86_64-*-* i?86-*-* } } }
diff --git a/gcc/tree-ssa-loop-im.cc b/gcc/tree-ssa-loop-im.cc
index 86ce6acb023..f5b01e986ae 100644
--- a/gcc/tree-ssa-loop-im.cc
+++ b/gcc/tree-ssa-loop-im.cc
@@ -617,7 +617,8 @@ stmt_cost (gimple *stmt)
   if (gimple_code (stmt) != GIMPLE_ASSIGN)
     return 1;
 
-  switch (gimple_assign_rhs_code (stmt))
+  enum tree_code code = gimple_assign_rhs_code (stmt);
+  switch (code)
     {
     case MULT_EXPR:
     case WIDEN_MULT_EXPR:
@@ -645,6 +646,11 @@ stmt_cost (gimple *stmt)
       /* Shifts and rotates are usually expensive.  */
       return LIM_EXPENSIVE;
 
+    case COND_EXPR:
+    case VEC_COND_EXPR:
+      /* Conditionals are expensive.  */
+      return LIM_EXPENSIVE;
+
     case CONSTRUCTOR:
       /* Make vector construction cost proportional to the number
          of elements.  */
@@ -658,6 +664,9 @@ stmt_cost (gimple *stmt)
       return 0;
 
     default:
+      /* Comparisons are usually expensive.  */
+      if (TREE_CODE_CLASS (code) == tcc_comparison)
+	return LIM_EXPENSIVE;
       return 1;
     }
 }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-06-28 13:05 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-28 13:05 [gcc r14-2161] tree-optimization/110451 - hoist invariant compare after interchange Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).