http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36842
Tobias Burnus <burnus at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |burnus at gcc dot gnu.org --- Comment #3 from Tobias Burnus <burnus at gcc dot gnu.org> 2011-09-07 09:13:07 UTC --- At least I fail how the compiler can know whether the arguments alias or not. For an illustration, use: real(kind=kind(1.0d0)), target :: data(5,5) data = Reshape([((i*10+j, i = 1, 5), j=1,5)], [5,5]) Rx => data(1,:) Ry => data for the actual argument. You will get different results with the current code, Ry(:,n) = Ry(:,n) * Rx(:) and with a loop which simply assigns it without a temporary, do m = 1, size(Rx) Ry(m,n) = Ry(m,n) * Rx(m) end do Thus, I see no other possibility than having a temporary which stores first the evaluated right-hand side before it assigns it to the left-hand side. As noted by Mikael, if the compiler knows that the two variables cannot alias, no temporary is generated. That's the case if one of the variables is neither a target nor a pointer - or if both variables are nonpointers (also with target) but not dummy arguments - or both are nonpointers (also with target and dummy argument) but allocatable. (Cf. gcc/fortran/dependency.c's gfc_check_dependency). * * * It would help a lot if the temporary generation (malloc/free) could be moved out of the loop; however, that's nontrivial to do for both the front end and for the middle end. Cf. PR 19831 and PR 21046. * * * Regarding the heap usage: Since GCC 4.7 the flag -fstack-arrays exists (implied by -Ofast), which uses the stack instead of the heap for the temporary array. Thus, unless someone has a better idea or comes up with an optimizable test case, I vote for closing this PR.