On Fri, Jul 13, 2018 at 12:05 AM Kelvin Nilsen <kdnil...@linux.ibm.com> wrote: > > A somewhat old "issue report" pointed me to the code generated for a 4-fold > manually unrolled version of the following loop: > > > while (++len != len_limit) /* this is loop */ > > if (pb[len] != cur[len]) > > break; > > As unrolled, the loop appears as: > > > while (++len != len_limit) /* this is loop */ { > > if (pb[len] != cur[len]) > > break; > > if (++len == len_limit) /* unrolled 2nd iteration */ > > break; > > if (pb[len] != cur[len]) > > break; > > if (++len == len_limit) /* unrolled 3rd iteration */ > > break; > > if (pb[len] != cur[len]) > > break; > > if (++len == len_limit) /* unrolled 4th iteration */ > > break; > > if (pb[len] != cur[len]) > > break; > > } > > In examining the behavior of tree-ssa-loop-ivopts.c, I've discovered the only > induction variable candidates that are being considered are all forms of the > len variable. We are not considering any induction variables to represent > the address expressions &pb[len] and &cur[len].
I am surprised - did you dig down why? Because generally IVOPTs does consider pointer IVs. Richard. > I rewrote the source code for this loop to make the addressing expressions > more explicit, as in the following: > > > cur++; > > while (++pb != last_pb) /* this is loop */ { > > if (*pb != *cur) > > break; > > ++cur; > > if (++pb == last_pb) /* unrolled 2nd iteration */ > > break; > > if (*pb != *cur) > > break; > > ++cur; > > if (++pb == last_pb) /* unrolled 3rd iteration */ > > break; > > if (*pb != *cur) > > break; > > ++cur; > > if (++pb == last_pb) /* unrolled 4th iteration */ > > break; > > if (*pb != *cur) > > break; > > ++cur; > > } > > Now, gcc does a better job of identifying the "address expression induction > variables". This version of the loop runs about 10% faster than the original > on my target architecture. > > This would seem to be a textbook pattern for the induction variable analysis. > Does anyone have any thoughts on the best way to add these candidates to the > set of induction variables that are considered by tree-ssa-loop-ivopts.c? > > Thanks in advance for any suggestions. >