On 5/20/19 2:04 AM, Richard Biener wrote: > On Sun, May 19, 2019 at 6:16 PM Marc Glisse <marc.gli...@inria.fr> wrote: >> >> Hello, >> >> 2 pieces: >> >> - the first one handles the case where the denominator is negative. It >> doesn't happen often with exact_div, so I don't handle it everywhere, but >> this one looked trivial >> >> - handle the case where a pointer difference is cast to an unsigned type >> before being compared to a constant (I hit this in std::vector). With some >> range info we could probably handle some non-constant cases as well... >> >> The second piece breaks Walloca-13.c (-Walloca-larger-than=100 -O2) >> >> void f (void*); >> void g (int *p, int *q) >> { >> __SIZE_TYPE__ n = (__SIZE_TYPE__)(p - q); >> if (n < 100) >> f (__builtin_alloca (n)); >> } >> >> At the time of walloca2, we have >> >> _1 = p_5(D) - q_6(D); >> # RANGE [-2305843009213693952, 2305843009213693951] >> _2 = _1 /[ex] 4; >> # RANGE ~[2305843009213693952, 16140901064495857663] >> n_7 = (long unsigned intD.10) _2; >> _11 = (long unsigned intD.10) _1; >> if (_11 <= 396) >> [...] >> _3 = allocaD.1059 (n_7); >> >> and warn. > > That's indeed to complicated relation of _11 to n_7 for > VRP predicate discovery. > >> However, DOM3 later produces >> >> _1 = p_5(D) - q_6(D); >> _11 = (long unsigned intD.10) _1; >> if (_11 <= 396) > > while _11 vs. _1 works fine. > >> [...] >> # RANGE [0, 99] NONZERO 127 >> _2 = _1 /[ex] 4; >> # RANGE [0, 99] NONZERO 127 >> n_7 = (long unsigned intD.10) _2; >> _3 = allocaD.1059 (n_7); >> >> so I am tempted to say that the walloca2 pass is too early, xfail the >> testcase and file an issue... > > Hmm, there's a DOM pass before walloca2 already and moving > walloca2 after loop opts doesn't look like the best thing to do? > I suppose it's not DOM but sinking that does the important transform > here? That is, It could well be sinking that's critical here. It certainly was in cases I looked at in our <vec> code and how we needed to transform the pointer subtraction and subsequent testing to discover infeasible paths.
Jeff