https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88044
--- Comment #5 from bin cheng <amker at gcc dot gnu.org> --- (In reply to seurer from comment #4) > Any progress on this? It really slows down test runs as it hangs twice and > has to wait for the timeout to occur to continue. Sorry for being slow. I am still not very sure where the issue is. Look at the dump before ivcanon (at ivcanon the code diverges w/o the patch): ;; basic block 7, loop depth 1, count 8656061039 (estimated locally), maybe hot ;; prev block 6, next block 24, flags: (NEW, REACHABLE, VISITED) ;; pred: 6 [always] count:1073312328 (estimated locally) (FALLTHRU,EXECUTABLE) ;; 23 [always] count:7582748748 (estimated locally) (FALLTHRU,DFS_BACK) # .MEM_95 = PHI <.MEM_62(6), .MEM_94(23)> # RANGE [0, 4] NONZERO 7 # n_63 = PHI <0(6), _28(23)> # RANGE [-1, 2] _19 = n_63 + -1; # RANGE [-1, 2] _20 = (integer(kind=8)D.4) _19; # RANGE [0, 2] NONZERO 3 _22 = MAX_EXPR <_20, 0>; # RANGE [0, 2] NONZERO 3 _25 = (sizetype) _22; # RANGE [1, 2] NONZERO 3 _26 = MAX_EXPR <_25, 1>; # .MEM_74 = VDEF <.MEM_95> # PT = null { D.2402 } # ALIGN = 8, MISALIGN = 0 # USE = nonlocal null # CLB = nonlocal null _27 = mallocD.235 (_26); # .MEM_75 = VDEF <.MEM_74> D.2389.spanD.2142 = 1; # .MEM_76 = VDEF <.MEM_75> MEM[(struct dtype_type *)&D.2389 + 24B] = {}; # .MEM_77 = VDEF <.MEM_76> D.2389.dtypeD.2141.elem_lenD.2079 = 1; # .MEM_78 = VDEF <.MEM_77> D.2389.dtypeD.2141.rankD.2081 = 1; # .MEM_79 = VDEF <.MEM_78> D.2389.dtypeD.2141.typeD.2082 = 6; # .MEM_80 = VDEF <.MEM_79> D.2389.dimD.2143[0].lboundD.2102 = 1; # .MEM_81 = VDEF <.MEM_80> D.2389.dimD.2143[0].uboundD.2103 = _20; # .MEM_82 = VDEF <.MEM_81> D.2389.dimD.2143[0].strideD.2101 = 1; # .MEM_83 = VDEF <.MEM_82> D.2389.dataD.2139 = pretmp_65; # .MEM_84 = VDEF <.MEM_83> D.2389.offsetD.2140 = -1; # .MEM_85 = VDEF <.MEM_84> # PT = nonlocal escaped null { D.2389 D.2401 } # USE = nonlocal escaped null { D.2389 D.2401 } # CLB = nonlocal escaped _47 = _gfortran_internal_packD.1827 (&D.2389); if (_20 >= _22) goto <bb 24>; [67.00%] else goto <bb 8>; [33.00%] ;; succ: 24 [67.0% (guessed)] count:5799560912 (estimated locally) (TRUE_VALUE,EXECUTABLE) ;; 8 [33.0% (guessed)] count:2856500127 (estimated locally) (FALSE_VALUE,EXECUTABLE) ;; basic block 24, loop depth 1, count 5799560912 (estimated locally), maybe hot ;; prev block 7, next block 8, flags: (NEW) ;; pred: 7 [67.0% (guessed)] count:5799560912 (estimated locally) (TRUE_VALUE,EXECUTABLE) goto <bb 9>; [100.00%] ;; succ: 9 [always] count:5799560912 (estimated locally) (FALLTHRU) ;; basic block 8, loop depth 1, count 2856500143 (estimated locally), maybe hot ;; prev block 24, next block 9, flags: (NEW, REACHABLE, VISITED) ;; pred: 7 [33.0% (guessed)] count:2856500127 (estimated locally) (FALSE_VALUE,EXECUTABLE) # .MEM_86 = VDEF <.MEM_85> # PT = null { D.2403 } # ALIGN = 8, MISALIGN = 0 # USE = nonlocal null # CLB = nonlocal null _49 = mallocD.235 (_26); # .MEM_87 = VDEF <.MEM_86> # USE = nonlocal null # CLB = nonlocal null memcpyD.588 (_49, _47, _25); ;; succ: 9 [always (adjusted)] count:2856500143 (estimated locally) (FALLTHRU,EXECUTABLE) ;; basic block 9, loop depth 1, count 8656061039 (estimated locally), maybe hot ;; prev block 8, next block 25, flags: (NEW, REACHABLE, VISITED) ;; pred: 8 [always (adjusted)] count:2856500143 (estimated locally) (FALLTHRU,EXECUTABLE) ;; 24 [always] count:5799560912 (estimated locally) (FALLTHRU) # PT = nonlocal escaped null { D.2389 D.2401 D.2403 } # transfer.5_53 = PHI <_49(8), _47(24)> # .MEM_56 = PHI <.MEM_87(8), .MEM_85(24)> if (_20 > 0) goto <bb 10>; [41.48%] else goto <bb 25>; [58.52%] ;; succ: 10 [41.5% (guessed)] count:3590534146 (estimated locally) (TRUE_VALUE,EXECUTABLE) ;; 25 [58.5% (guessed)] count:5065526893 (estimated locally) (FALSE_VALUE,EXECUTABLE) ;; basic block 25, loop depth 1, count 5065526893 (estimated locally), maybe hot ;; prev block 9, next block 10, flags: (NEW) ;; pred: 9 [58.5% (guessed)] count:5065526893 (estimated locally) (FALSE_VALUE,EXECUTABLE) goto <bb 11>; [100.00%] ;; succ: 11 [always] count:5065526893 (estimated locally) (FALLTHRU) ;; basic block 10, loop depth 1, count 3590534111 (estimated locally), maybe hot ;; prev block 25, next block 11, flags: (NEW, REACHABLE, VISITED) ;; pred: 9 [41.5% (guessed)] count:3590534146 (estimated locally) (TRUE_VALUE,EXECUTABLE) # .MEM_88 = VDEF <.MEM_56> # USE = nonlocal null # CLB = nonlocal null memcpyD.588 (_27, transfer.5_53, _25); ;; succ: 11 [always (adjusted)] count:3590534111 (estimated locally) (FALLTHRU,EXECUTABLE) ;; basic block 11, loop depth 1, count 8656061039 (estimated locally), maybe hot ;; prev block 10, next block 26, flags: (NEW, REACHABLE, VISITED) ;; pred: 10 [always (adjusted)] count:3590534111 (estimated locally) (FALLTHRU,EXECUTABLE) ;; 25 [always] count:5065526893 (estimated locally) (FALLTHRU) # .MEM_57 = PHI <.MEM_88(10), .MEM_56(25)> if (_47 != pretmp_65) goto <bb 12>; [53.47%] else goto <bb 26>; [46.53%] ;; succ: 12 [53.5% (guessed)] count:4628395827 (estimated locally) (TRUE_VALUE,EXECUTABLE) ;; 26 [46.5% (guessed)] count:4027665212 (estimated locally) (FALSE_VALUE,EXECUTABLE) ;; basic block 26, loop depth 1, count 4027665212 (estimated locally), maybe hot ;; prev block 11, next block 12, flags: (NEW) ;; pred: 11 [46.5% (guessed)] count:4027665212 (estimated locally) (FALSE_VALUE,EXECUTABLE) goto <bb 13>; [100.00%] ;; succ: 13 [always] count:4027665212 (estimated locally) (FALLTHRU) ;; basic block 12, loop depth 1, count 4628395839 (estimated locally), maybe hot ;; prev block 26, next block 13, flags: (NEW, REACHABLE, VISITED) ;; pred: 11 [53.5% (guessed)] count:4628395827 (estimated locally) (TRUE_VALUE,EXECUTABLE) # .MEM_89 = VDEF <.MEM_57> # USE = nonlocal null # CLB = nonlocal null freeD.234 (_47); ;; succ: 13 [always (adjusted)] count:4628395839 (estimated locally) (FALLTHRU,EXECUTABLE) ;; basic block 13, loop depth 1, count 8656061039 (estimated locally), maybe hot ;; prev block 12, next block 27, flags: (NEW, REACHABLE, VISITED) ;; pred: 12 [always (adjusted)] count:4628395839 (estimated locally) (FALLTHRU,EXECUTABLE) ;; 26 [always] count:4027665212 (estimated locally) (FALLTHRU) # .MEM_58 = PHI <.MEM_89(12), .MEM_57(26)> if (_20 < _22) goto <bb 14>; [33.00%] else goto <bb 27>; [67.00%] ;; succ: 14 [33.0% (guessed)] count:2856500127 (estimated locally) (TRUE_VALUE,EXECUTABLE) ;; 27 [67.0% (guessed)] count:5799560912 (estimated locally) (FALSE_VALUE,EXECUTABLE) ;; basic block 27, loop depth 1, count 5799560912 (estimated locally), maybe hot ;; prev block 13, next block 14, flags: (NEW) ;; pred: 13 [67.0% (guessed)] count:5799560912 (estimated locally) (FALSE_VALUE,EXECUTABLE) goto <bb 15>; [100.00%] ;; succ: 15 [always] count:5799560912 (estimated locally) (FALLTHRU) ;; basic block 14, loop depth 1, count 2856500143 (estimated locally), maybe hot ;; prev block 27, next block 15, flags: (NEW, REACHABLE, VISITED) ;; pred: 13 [33.0% (guessed)] count:2856500127 (estimated locally) (TRUE_VALUE,EXECUTABLE) # .MEM_90 = VDEF <.MEM_58> # USE = nonlocal null # CLB = nonlocal null freeD.234 (transfer.5_53); ;; succ: 15 [always (adjusted)] count:2856500143 (estimated locally) (FALLTHRU,EXECUTABLE) ;; basic block 15, loop depth 1, count 8656061039 (estimated locally), maybe hot ;; prev block 14, next block 16, flags: (NEW, REACHABLE, VISITED) ;; pred: 14 [always (adjusted)] count:2856500143 (estimated locally) (FALLTHRU,EXECUTABLE) ;; 27 [always] count:5799560912 (estimated locally) (FALLTHRU) # .MEM_59 = PHI <.MEM_90(14), .MEM_58(27)> # .MEM_91 = VDEF <.MEM_59> D.2389 ={v} {CLOBBER}; if (n_63 <= 1) goto <bb 16>; [41.00%] else goto <bb 18>; [59.00%] ;; succ: 16 [41.0% (guessed)] count:3548984995 (estimated locally) (TRUE_VALUE,EXECUTABLE) ;; 18 [59.0% (guessed)] count:5107076044 (estimated locally) (FALSE_VALUE,EXECUTABLE) ;; basic block 16, loop depth 1, count 3548985018 (estimated locally), maybe hot ;; prev block 15, next block 17, flags: (NEW, REACHABLE, VISITED) ;; pred: 15 [41.0% (guessed)] count:3548984995 (estimated locally) (TRUE_VALUE,EXECUTABLE) if (_19 > 0) goto <bb 17>; [0.04%] else goto <bb 28>; [99.96%] ;; succ: 17 [0.0% (guessed)] count:1419592 (estimated locally) (TRUE_VALUE,EXECUTABLE) ;; 28 [100.0% (guessed)] count:3547565426 (estimated locally) (FALSE_VALUE,EXECUTABLE) ;; basic block 17, loop depth 0, count 1419591 (estimated locally) ;; prev block 16, next block 18, flags: (NEW, REACHABLE, VISITED) ;; pred: 16 [0.0% (guessed)] count:1419592 (estimated locally) (TRUE_VALUE,EXECUTABLE) # .MEM_96 = VDEF <.MEM_91> # USE = nonlocal null # CLB = nonlocal null _gfortran_stop_numericD.1808 (1, 0); ;; succ: ;; basic block 18, loop depth 1, count 5106238449 (estimated locally), maybe hot ;; prev block 17, next block 29, flags: (NEW, REACHABLE, VISITED) ;; pred: 15 [59.0% (guessed)] count:5107076044 (estimated locally) (FALSE_VALUE,EXECUTABLE) if (_19 < 0) goto <bb 19>; [0.04%] else goto <bb 29>; [99.96%] ;; succ: 19 [0.0% (guessed)] count:2042492 (estimated locally) (TRUE_VALUE,EXECUTABLE) ;; 29 [100.0% (guessed)] count:5104195957 (estimated locally) (FALSE_VALUE,EXECUTABLE) ;; basic block 29, loop depth 1, count 5104195957 (estimated locally), maybe hot ;; prev block 18, next block 19, flags: (NEW) ;; pred: 18 [100.0% (guessed)] count:5104195957 (estimated locally) (FALSE_VALUE,EXECUTABLE) goto <bb 20>; [100.00%] ;; succ: 20 [always] count:5104195957 (estimated locally) (FALLTHRU) ;; basic block 19, loop depth 0, count 2042498 (estimated locally) ;; prev block 29, next block 28, flags: (NEW, REACHABLE, VISITED) ;; pred: 18 [0.0% (guessed)] count:2042492 (estimated locally) (TRUE_VALUE,EXECUTABLE) # .MEM_92 = VDEF <.MEM_91> # USE = nonlocal null # CLB = nonlocal null _gfortran_stop_numericD.1808 (2, 0); ;; succ: ;; basic block 28, loop depth 1, count 3547565426 (estimated locally), maybe hot ;; prev block 19, next block 20, flags: (NEW) ;; pred: 16 [100.0% (guessed)] count:3547565426 (estimated locally) (FALSE_VALUE,EXECUTABLE) ;; succ: 20 [always] count:3547565426 (estimated locally) (FALLTHRU) ;; basic block 20, loop depth 1, count 8652598961 (estimated locally), maybe hot ;; prev block 28, next block 23, flags: (NEW, REACHABLE, VISITED) ;; pred: 28 [always] count:3547565426 (estimated locally) (FALLTHRU) ;; 29 [always] count:5104195957 (estimated locally) (FALLTHRU) # .MEM_93 = VDEF <.MEM_91> # USE = nonlocal null # CLB = nonlocal null freeD.234 (_27); # .MEM_94 = VDEF <.MEM_93> D.2365 ={v} {CLOBBER}; # RANGE [1, 4] NONZERO 7 _28 = n_63 + 1; if (_28 == 4) goto <bb 21>; [12.36%] else goto <bb 23>; [87.64%] ;; succ: 21 [12.4% (guessed)] count:1069850213 (estimated locally) (TRUE_VALUE,EXECUTABLE) ;; 23 [87.6% (guessed)] count:7582748748 (estimated locally) (FALSE_VALUE,EXECUTABLE) ;; basic block 23, loop depth 1, count 7582748748 (estimated locally), maybe hot ;; prev block 20, next block 21, flags: (NEW) ;; pred: 20 [87.6% (guessed)] count:7582748748 (estimated locally) (FALSE_VALUE,EXECUTABLE) goto <bb 7>; [100.00%] ;; succ: 7 [always] count:7582748748 (estimated locally) (FALLTHRU,DFS_BACK) ;; basic block 21, loop depth 0, count 1069422300 (estimated locally), maybe hot ;; prev block 23, next block 1, flags: (NEW, REACHABLE, VISITED) ;; pred: 20 [12.4% (guessed)] count:1069850213 (estimated locally) (TRUE_VALUE,EXECUTABLE) # .MEM_98 = VDEF <.MEM_94> # USE = nonlocal null # CLB = nonlocal null freeD.234 (_7); # VUSE <.MEM_98> return 0; ;; succ: EXIT [always (adjusted)] count:1069422300 (estimated locally) (EXECUTABLE) Note basic blocks 16 and 18. _19 is computed as {-1, 1}, so one of checks in bb16/bb18 must exist on the first iteration by calling _gfortran_stop_numeric(1/2, 0) So this two exits edge give small niters information than exit in basic block 20, the conditional check in bb20 is turned into a goto, as in dump from optimized: ;; basic block 18, loop depth 1, count 8652598961 (estimated locally), maybe hot ;; prev block 17, next block 1, flags: (NEW, REACHABLE, VISITED) ;; pred: 14 [100.0% (guessed)] count:3547565426 (estimated locally) (FALSE_VALUE,EXECUTABLE) ;; 16 [100.0% (guessed)] count:5104195957 (estimated locally) (FALSE_VALUE,EXECUTABLE) # .MEM_93 = VDEF <.MEM_91> # USE = nonlocal null # CLB = nonlocal null freeD.234 (_27); ivtmp.50_34 = ivtmp.50_36 + 1; goto <bb 5>; [100.00%] ;; succ: 5 [always] count:8652598961 (estimated locally) (FALLTHRU,DFS_BACK,EXECUTABLE) This change is caused by code re-arrangement in the patch: /* If the loop exits immediately, there is nothing to do. */ tree tem = fold_binary (code, boolean_type_node, iv0->base, iv1->base); if (tem && integer_zerop (tem)) { niter->niter = build_int_cst (unsigned_type_for (type), 0); niter->max = 0; return true; } /* Handle special case loops: while (i-- < 10) and while (10 < i++) by adjusting iv0, iv1 and code. */ if (code != NE_EXPR && (tree_int_cst_sign_bit (iv0->step) || (!integer_zerop (iv1->step) && !tree_int_cst_sign_bit (iv1->step))) && !adjust_cond_for_loop_until_wrap (type, iv0, &code, iv1)) return false; Actually the first if-statement is bypassed previous because now the second if-statement is modified and moved after the first one. But the transformation looks good to me, unless _gfortran_stop_numeric hangs? Thanks, bin