[Patch, fortran] PR44582 - gfortran generates wrong results due to wrong ABI in function with array return
H.J. Lu
hjl.tools@gmail.com
Sat Oct 30 13:09:00 GMT 2010
On Mon, Jun 28, 2010 at 9:47 AM, Paul Richard Thomas
<paul.richard.thomas@gmail.com> wrote:
> This PR is marked as critical.
>
> For as long as I can remember, gfortran has made assignments of the kind:
> lhs_array = array_valued_function (args,...)
> without a temporary, except when, for example, there is a dependency
> between the lhs_array and one of the arguments.
>
> The reporter (Yin Ma of Absoft) noticed that aliasing could occur
> between the function result and other forms of association. The
> example below, due to Tobias Burnus, illustrates this.
>
> program test
> implicit none
> integer :: a(5)
> a = 5
> a = f() ! assignment
> print *, a
> a = 5
> print *, f() ! print
> contains
> function f()
> integer :: f(size(a))
> f = -5 ! Resets 'a' to -5 in the assignment
> f = a - f ! Gives 0 for the assignment and 10 for the print
> end function f
> end program test
>
> This program prints a row of 0's followed by a row of 10's, whereas
> two rows of 10's is the correct result.
>
> The attached patch fixes this by being much more restrictive in the
> use of this optimization. In fact, it is still conservative as the
> 'TODO' in the new function indicates. The testcase incorporates the
> above and a number of other aliasing situations. Trunk currently
> fails all the cases that need a temporary.
>
> Bootstrapped and regtested on FC9/x86_64 - OK for trunk, 4.5,4.4 and 4.3?
>
> Cheers
>
> Paul
>
> 2010-06-28 Paul Thomas <pault@gcc.gnu.org>
>
> PR fortran/44582
> * trans-expr.c (arrayfunc_assign_needs_temporary): New function
> to determine if a function assignment can be made without a
> temporary.
> (gfc_trans_arrayfunc_assign): Move all the conditions that
> suppress the direct function call to the above new functon and
> call it.
>
> 2010-06-28 Paul Thomas <pault@gcc.gnu.org>
>
> PR fortran/44582
> * gfortran.dg/aliasing_array_result_1.f90 : New test.
>
This caused:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46213
--
H.J.
More information about the Fortran
mailing list