On 11/16/16 9:08 AM, Richard Biener wrote:

> On Tue, Nov 15, 2016 at 9:03 PM, Bill Schmidt
> <wschm...@linux.vnet.ibm.com> wrote:
>> -  if ((any_pred_load_store || any_complicated_phi)
>> -      && !version_loop_for_if_conversion (loop))
>> +  /* Since we have no cost model, always version loops if vectorization
>> +     is enabled.  Either version this loop, or if the pattern is right
>> +     for outer-loop vectorization, version the outer loop.  In the
>> +     latter case we will still if-convert the original inner loop.  */
>> +  /* FIXME: When SLP vectorization can handle if-conversion on its own,
>> +     predicate all of if-conversion on flag_tree_loop_vectorize.  */
>> +  if ((any_pred_load_store || any_complicated_phi || 
>> flag_tree_loop_vectorize)
> I'd say given fun->has_force_vectorize_loops this should be
>
>        if (flag_tree_loop_if_convert != 1
>> +      && !version_loop_for_if_conversion
>> +      (versionable_outer_loop_p (loop_outer (loop))
>> +       ? loop_outer (loop) : loop))
>>      goto cleanup;
> and thus always version if the user didnt' specify -ftree-loop-if-convert
> (-ftree-loop-if-convert-stores is dead, I forgot to remove uses).
>
> Can you as a first patch (after fixing the minor things above) commit
> the patch w/o changing the condition under which we version
> (but _do_ version the outer loop if possible?).  This should be a strict
> improvement enabling more outer loop vectorization.

Done and committed.  Thanks!

>
> The 2nd patch can then fix the PR and change the condition.
>
> Thus, ok with the nits fixed and the condition unchanged.
>
> Can you re-test the 2nd part with my suggested changed predicate?

Yes, the new predicate works fine.  New patch below, bootstrapped and tested
on powerpc64le-unknown-linux-gnu, with only the bb-slp-cond-1.c regressions
previously discussed.  Is this ok for trunk?

Thanks,
Bill

>
> Thanks,
> Richard.
>
[gcc]

2016-11-16  Bill Schmidt  <wschm...@linux.vnet.ibm.com>
            Richard Biener  <rguent...@suse.de>

        PR tree-optimization/77848
        * tree-if-conv.c (tree_if_conversion): Always version loops unless
        the user specified -ftree-loop-if-convert.

[gcc/testsuite]

2016-11-16  Bill Schmidt  <wschm...@linux.vnet.ibm.com>
            Richard Biener  <rguent...@suse.de>

        PR tree-optimization/77848
        * gfortran.dg/vect/pr77848.f: New test.


Index: gcc/testsuite/gfortran.dg/vect/pr77848.f
===================================================================
--- gcc/testsuite/gfortran.dg/vect/pr77848.f    (revision 0)
+++ gcc/testsuite/gfortran.dg/vect/pr77848.f    (working copy)
@@ -0,0 +1,24 @@
+! PR 77848: Verify versioning is on when vectorization fails
+! { dg-do compile }
+! { dg-options "-O3 -ffast-math -fdump-tree-ifcvt -fdump-tree-vect-details" }
+
+      subroutine sub(x,a,n,m)
+      implicit none
+      real*8 x(*),a(*),atemp
+      integer i,j,k,m,n
+      real*8 s,t,u,v
+      do j=1,m
+         atemp=0.d0
+         do i=1,n
+            if (abs(a(i)).gt.atemp) then
+               atemp=a(i)
+               k = i
+            end if
+         enddo
+         call dummy(atemp,k)
+      enddo
+      return
+      end
+
+! { dg-final { scan-tree-dump "LOOP_VECTORIZED" "ifcvt" } }
+! { dg-final { scan-tree-dump "vectorized 0 loops in function" "vect" } }
Index: gcc/tree-if-conv.c
===================================================================
--- gcc/tree-if-conv.c  (revision 242521)
+++ gcc/tree-if-conv.c  (working copy)
@@ -2803,10 +2803,12 @@ tree_if_conversion (struct loop *loop)
          || loop->dont_vectorize))
     goto cleanup;
 
-  /* Either version this loop, or if the pattern is right for outer-loop
-     vectorization, version the outer loop.  In the latter case we will
-     still if-convert the original inner loop.  */
-  if ((any_pred_load_store || any_complicated_phi)
+  /* Since we have no cost model, always version loops unless the user
+     specified -ftree-loop-if-convert.  Either version this loop, or if
+     the pattern is right for outer-loop vectorization, version the
+     outer loop.  In the latter case we will still if-convert the
+     original inner loop.  */
+  if (flag_tree_loop_if_convert != 1
       && !version_loop_for_if_conversion
       (versionable_outer_loop_p (loop_outer (loop))
        ? loop_outer (loop) : loop))

Reply via email to