------- Comment #2 from pault at gcc dot gnu dot org 2007-01-08 12:23 ------- logical :: l1(2,2) = reshape ((/.false.,.true.,.true.,.false./), (/2,2/)) integer :: it(2,2) = reshape ((/1,2,3,4/), (/2,2/)) forall (i = 1:2, i < 3) forall (j = 1:2, l1(i,j)) it(i, j) = 0 end forall end forall ! print *, l1 ! print '(4i2)', it end
gfortran gives: F T T F 0 0 0 0 the correct result is, of course: F T T F 1 0 0 4 The (annotated) code is: MAIN__ () { int4 j; static int4 it[4] = {1, 2, 3, 4}; int4 i; static logical4 l1[4] = {0, 1, 1, 0}; _gfortran_set_std (70, 127, 0); { int4 mi.2; int4 count.3; logical1 temp.1[2]; int4 i.0; mi.2 = 0; i.0 = 1; count.3 = 2; while (1) { if (count.3 <= 0) goto L.1; temp.1[mi.2] = i.0 <= 2; mi.2 = mi.2 + 1; i.0 = i.0 + 1; count.3 = count.3 - 1; } L.1:; { int4 mi.6; int4 count.9; int4 count.8; int4 count.7; logical1 temp.5[2]; int4 j.4; mi.6 = 0; j.4 = 1; count.7 = 2; while (1) /* i.0 is now 3 */ { if (count.7 <= 0) goto L.2; temp.5[mi.6] = (logical1) l1[j.4 * 2 + NON_LVALUE_EXPR <i.0> + -3]; mi.6 = mi.6 + 1; j.4 = j.4 + 1; count.7 = count.7 - 1; } L.2:; /* temp.5 = {1, ?} */ i.0 = 1; mi.2 = 0; count.9 = 2; while (1) { if (count.9 <= 0) goto L.4; if (temp.1[mi.2]) { j.4 = 1; mi.6 = 0; count.8 = 2; while (1) { if (count.8 <= 0) goto L.3; if (temp.5[mi.6]) /* {1, ?} */ { it[j.4 * 2 + NON_LVALUE_EXPR <i.0> + -3] = 0; } j.4 = j.4 + 1; mi.6 = mi.6 + 1; count.8 = count.8 - 1; } /* Since ? probably != 0 => it = 0 */ L.3:; } i.0 = i.0 + 1; mi.2 = mi.2 + 1; count.9 = count.9 - 1; } L.4:; } } } >From which we see that nested masks, with dependencies on the outer indices, are not being evaluated with anything other than out of range values for the outer indices. In fact the mask is either not being given the correct rank or the nesting of each block should include evaluation of the mask within the outer loops. I have not thought through if the last is consistent with dependency analysis. Paul -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30404