------------------------------------------------------------------ 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? Updated patch attached, bootstrap and test on x86_64. 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.
pr84648-20181114.txt
Description: Binary data