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)); }