Any comment on this patch?
thanks, Cong On Thu, Oct 3, 2013 at 3:59 PM, Cong Hou <co...@google.com> wrote: > During loop versioning in vectorization, the alias check guarantees > that any load of a data reference with zero-step is a loop invariant, > which can be hoisted outside of the loop. After hoisting the load > statement, there may exist more loop invariant statements. This patch > tries to find all those statements and hoists them before the loop. > > An example is shown below: > > > for (i = 0; i < N; ++i) > a[i] = *b + 1; > > > After loop versioning the loop to be vectorized is guarded by > > if (b + 1 < a && a + N < b) > > which means there is no aliasing between *b and a[i]. The GIMPLE code > of the loop body is: > > <bb 5>: > # i_18 = PHI <0(4), i_29(6)> > # ivtmp_22 = PHI <10000(4), ivtmp_30(6)> > _23 = (long unsigned int) i_18; > _24 = _23 * 4; > _25 = a_6(D) + _24; > _26 = *b_8(D); =====> loop invariant > _27 = _26 + 1; =====> loop invariant > *_25 = _27; > i_29 = i_18 + 1; > ivtmp_30 = ivtmp_22 - 1; > if (ivtmp_30 != 0) > goto <bb 6>; > else > goto <bb 21>; > > > After hoisting loop invariant statements: > > > _26 = *b_8(D); > _27 = _26 + 1; > > <bb 5>: > # i_18 = PHI <0(4), i_29(6)> > # ivtmp_22 = PHI <10000(4), ivtmp_30(6)> > _23 = (long unsigned int) i_18; > _24 = _23 * 4; > _25 = a_6(D) + _24; > *_25 = _27; > i_29 = i_18 + 1; > ivtmp_30 = ivtmp_22 - 1; > if (ivtmp_30 != 0) > goto <bb 6>; > else > goto <bb 21>; > > > This patch is related to the bug report > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58508 > > > thanks, > Cong