https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104986
--- Comment #5 from Andrew Macleod <amacleod at redhat dot com> --- (In reply to Richard Biener from comment #3) > This is peeling leaving us with unreachable code we warn on and somehow > while figuring prephitmp_30 + -6 is -1 we don't figure nb_58 is zero on > the path to bb9. > > I think I've seen this backward-forward dependency issue with ranger before > in another missed optimization PR. (In reply to Richard Biener from comment #3) > This is peeling leaving us with unreachable code we warn on and somehow > while figuring prephitmp_30 + -6 is -1 we don't figure nb_58 is zero on > the path to bb9. > > I think I've seen this backward-forward dependency issue with ranger before > in another missed optimization PR. DOM3 is the pass which converted prephitmp_30 + -6 to -1, and left nb_58 as is. Ranger appears to see it just fine. Looking at VRP2, Folding statement: nb_68 = prephitmp_30 + -5; Queued stmt for removal. Folds to: 0 <...> Folding statement: if (nb_68 != 0) gimple_simplified to if (0 != 0) Folded into: if (0 != 0) strlen runs just before vrp2, and if I put a VRP pass immediately before strlen1, then the warning goes away. Looking at the strlen1 output, it only ever asks ranger about 6 names: 334 range_of_expr(_36) at stmt _52 = iftmp.1_17 + _36; TRUE : (334) range_of_expr (_36) sizetype [3, 5] maybe_invalidate called for *_52 = _60; maybe_invalidate returns 1 342 range_of_expr(_69) at stmt _71 = iftmp.1_7 + _69; TRUE : (342) range_of_expr (_69) sizetype [3, 5] maybe_invalidate called for *_71 = _72; maybe_invalidate returns 1 348 range_of_expr(_6) at stmt _31 = iftmp.1_76 + _6; TRUE : (348) range_of_expr (_6) sizetype [2, 4] maybe_invalidate called for *_31 = _32; maybe_invalidate returns 1 367 range_of_expr(_37) at stmt _39 = iftmp.1_76 + _37; TRUE : (367) range_of_expr (_37) sizetype [1, 3] maybe_invalidate called for *_39 = _40; statement may clobber object _31 0 bytes in size maybe_invalidate returns 1 375 range_of_expr(_45) at stmt _47 = iftmp.1_76 + _45; TRUE : (375) range_of_expr (_45) sizetype [0, 2] maybe_invalidate called for *_47 = _48; statement may clobber object _39 0 bytes in size maybe_invalidate returns 1 383 range_of_expr(_53) at stmt _55 = iftmp.1_76 + _53; TRUE : (383) range_of_expr (_53) sizetype [1, 1] Is there a reason it runs before vrp2?