On Wed, Nov 14, 2018 at 11:09 AM bin.cheng <bin.ch...@linux.alibaba.com> wrote: > > ------------------------------------------------------------------ > Sender:Richard Biener <richard.guent...@gmail.com> > Sent at:2018 Nov 13 (Tue) 23:03 > To:bin.cheng <bin.ch...@linux.alibaba.com> > Cc:GCC Patches <gcc-patches@gcc.gnu.org> > Subject:Re: [PATCH PR84648]Adjust loop exit conditions for loop-until-wrap > cases. > > > > > On Sun, Nov 11, 2018 at 9:02 AM bin.cheng <bin.ch...@linux.alibaba.com> > > wrote: > >> > >> Hi, > >> This patch fixes PR84648 by adjusting exit conditions for loop-until-wrap > >> cases. > >> It only handles simple cases in which IV.base are constants because we > >> rely on > >> current niter analyzer which doesn't handle parameterized bound in wrapped > >> case. It could be relaxed in the future. > >> > >> Bootstrap and test on x86_64 in progress. > > > > Please use TYPE_MIN/MAX_VALUE or wi::min/max_value consistently. > > Either tree_int_cst_equal (iv0->base, TYPE_MIN_VALUE (type)) or > > wide_int_to_tree (niter_type, wi::max_value (TYPE_PRECISION (type), > > TYPE_SIGN (type))). > > > > Also > > > > + iv0->base = low; > > + iv0->step = fold_convert (niter_type, integer_one_node); > > > > build_int_cst (niter_type, 1); > > > > + iv1->base = high; > > + iv1->step = integer_zero_node; > > > > build_int_cst (niter_type, 0); > Fixed, thanks for reviewing. > > > > > With the code, what happens to signed IVs? I suppose we figure out things > > earlier by means of undefined overflow? > The code takes advantage of signed undefined overflow and handle it as wrap. > In the reported test case, we have following IL: > <bb 2> : > goto <bb 4>; [INV] > > <bb 3> : > i_4 = i_2 + 1; > > <bb 4> : > # i_2 = PHI <0(2), i_4(3)> > i.0_1 = (signed int) i_2; > if (i.0_1 >= 0) > goto <bb 3>; [INV] > else > goto <bb 5>; [INV] > > So the IV is actually transformed into signed int, we rely on scev to > understand > type conversion correctly and generate (int){0, 1} for i.0_1. Is this > reasonable?
I think so. > Updated patch attached, bootstrap and test on x86_64. OK. Thanks, Richard. > Thanks, > bin > > 2018-11-11 Bin Cheng <bin.ch...@linux.alibaba.com> > > PR tree-optimization/84648 > * tree-ssa-loop-niter.c (adjust_cond_for_loop_until_wrap): New. > (number_of_iterations_cond): Adjust exit cond for loop-until-wrap case > by calling adjust_cond_for_loop_until_wrap. > > 2018-11-11 Bin Cheng <bin.ch...@linux.alibaba.com> > > PR tree-optimization/84648 > * gcc.dg/tree-ssa/pr84648.c: New test. > * gcc.dg/pr68317.c: Add warning check on overflow.