>
> On Oct 21, 2005, at 9:19 AM, Toon Moene wrote:
>
> > L.S.,
> >
> > This code:
> >
> > SUBROUTINE S(A, B, N)
> > DIMENSION A(N), B(N)
> > READ*,Z,B
> > DO I = 1, N
> > A(I) = Z * B(I)
> > ENDDO
> > PRINT*,A
> > END
> >
> > when compiled thusly:
>
> The problem here is not really related to the vectorizer but the
> tree aliasing code. The loop looks like this at -O2 in the tree dumps:
> # z_49 = PHI <z_86(1), z_124(3)>;
> # i_1 = PHI <1(1), i_48(3)>;
> <L8>:;
> D.982_41 = i_1 + -1;
> # VUSE <z_49>;
> D.983_43 = (*b_20)[D.982_41];
> # VUSE <z_49>;
> z.4_45 = z;
> D.985_46 = D.983_43 * z.4_45;
> # z_124 = V_MAY_DEF <z_49>;
> (*a_36)[D.982_41] = D.985_46;
> i_48 = i_1 + 1;
> if (i_1 == D.972_25) goto <L4>; else goto <L13>;
>
> Notice how the statement which does "A(I) =" has a V_MAY_DEF of z. If
> we
> recorded it correctly, A and B would aliasing nothing as they are
> arguments
> passed in.
>
I think we actually fail before we try to antlialias A,B,z, because we
don't handle an invariant load ("z.4_45 = z;"). Invariant code motion
probably fails to take this out of the loop because of aliasing problems
dorit
> -- Pinski
>