Hi,
in this testcase predictive commoning decides to duplicate loop
with profile count of entry being 0.  This leads to division by
zero.  This patch fixes the profile ICE, but I will look into why
such update happens at first place.

Bootstrapped/regtested x86_64-linux, comitted.

Honza

        PR middle-end/83189
        * gfortran.fortran-torture/compile/pr83189.f90: New testcase.
        * tree-ssa-loop-manip.c (tree_transform_and_unroll_loop): Handle zero
        profile.

Index: testsuite/gfortran.fortran-torture/compile/pr83189.f90
===================================================================
--- testsuite/gfortran.fortran-torture/compile/pr83189.f90      (revision 
256478)
+++ testsuite/gfortran.fortran-torture/compile/pr83189.f90      (working copy)
@@ -1,30 +0,0 @@
+Module radin_mod
+  INTEGER, PARAMETER :: DP = selected_real_kind(14,200)
+Contains
+  Subroutine SPLIFT (X,Y,YP,YPP,N,IERR,ISX,A1,B1,AN,BN)
+    Integer,  Intent(in) :: N,ISX
+    Real(dp), Intent(in) :: X(N),Y(N),A1,B1,AN,BN
+    Real(dp), Intent(out) :: YP(N),YPP(N)
+    Real(dp), Allocatable, Dimension(:,:) :: W
+    NM1  = N-1
+    NM2  = N-2
+    If (ISX.Gt.0) GO TO 40
+    Do I=2,N
+       If (X(I)-X(I-1) .Le. 0) Then
+          IERR = 3
+          Return
+       Endif
+    End Do
+    Allocate(W(N,3))
+40  YPP(1) = 4*B1
+    DOLD = (Y(2)-Y(1))/W(2,2)
+    Do  I=2,NM2
+       DNEW   = (Y(I+1) - Y(I))/W(I+1,2)
+       YPP(I) = 6*(DNEW - DOLD)
+       YP(I)  = DOLD
+       DOLD = DNEW
+    End Do
+    Return
+  End Subroutine SPLIFT
+End Module radin_mod
+
Index: tree-ssa-loop-manip.c
===================================================================
--- tree-ssa-loop-manip.c       (revision 256441)
+++ tree-ssa-loop-manip.c       (working copy)
@@ -1378,7 +1378,8 @@ tree_transform_and_unroll_loop (struct l
     {
       /* Avoid dropping loop body profile counter to 0 because of zero count
         in loop's preheader.  */
-      freq_e = freq_e.force_nonzero ();
+      if (freq_h.nonzero_p () && !(freq_e == profile_count::zero ()))
+        freq_e = freq_e.force_nonzero ();
       scale_loop_frequencies (loop, freq_e.probability_in (freq_h));
     }
 

Reply via email to