[Patch, fortran] PR64952 - Missing temporary in assignment from elemental function
Paul Richard Thomas
paul.richard.thomas@gmail.com
Wed Feb 11 16:57:00 GMT 2015
Dear Dominique,
> The patch works as advertised! I have two remarks:
Of course it does :-)
>
> (1) AFAIU there is no need for a temporary for
Indeed not. I cannot see how that can be avoided without a much more
elaborate patch. Frankly, I do not see that it would be warranted.
Much better some extra temporaries in corner cases, than wrong code.
>
> PROGRAM Main
> INTEGER :: i, index(5) = (/ (i, i = 1,5) /)
> REAL :: tmp(5), array(5) = (/ (i+0.0, i = 1,5) /)
> tmp = Fred(index,array)
> array = tmp
> PRINT *, array
> CONTAINS
> ELEMENTAL FUNCTION Fred (n, x)
> REAL :: Fred
> INTEGER, INTENT(IN) :: n
> REAL, INTENT(IN) :: x
> ! In general, this would be in an external procedure
> Fred = x+SUM(array(:n-1))+SUM(array(n+1:))
> END FUNCTION Fred
> END PROGRAM Main
>
> However I get
>
> [Book15] f90/bug% gfc elemental_weird_db_2.f90 -Warray-temporaries
> elemental_weird_db_2.f90:4:10:
>
> tmp = Fred(index,array)
> 1
> Warning: Creating array temporary at (1) [-Warray-temporaries]
>
> (2) You wrote: << However, this works and has no perceivable effect on Polyhedron timings. >>. This is hardly a surprise since the Polyhedron tests don't use any elemental procedure.
:-) You might have gathered that I didn't check! Within errors, it
didn't affect compile times either.
Thanks for the feedback
Paul
>
> Thanks,
>
> Dominique
>
>> Le 10 févr. 2015 à 23:35, Paul Richard Thomas <paul.richard.thomas@gmail.com> a écrit :
>>
>> Dear Mikael, dear all,
>>
>> Thank you for the previous review. I believe that the attached
>> responds to all of your comments and correctly compiles the three
>> testcases that you provided. Two of these have been included in the
>> original testcase and the third appears separately.
>>
>> Bootstrapped and reg
>> tested on FC21/x86_64 - OK for trunk?
>>
>> Cheers
>>
>> Paul
>>
>> 2015-02-10 Paul Thomas <pault@gcc.gnu.org>
>>
>> PR fortran/64952
>> * gfortran.h : Add 'array_outer_dependency' to symbol_attr.
>> * trans.h : Add 'array_outer_dependency' to gfc_ss_info.
>> * module.c : Add AB_ARRAY_OUTER_DEPENDENCY to ab_attribute.
>> Add same to attr_bits.
>> (mio_symbol_attribute): Handle 'array_outer_dependency' attr
>> in module read and write.
>> * resolve.c (resolve_function): If an elemental function is
>> referenced that is marked as having an external array reference
>> and the current namespace is that of an elemental function,
>> mark the containing function likewise.
>> (resolve_variable): Mark elemental function symbol
>> as 'array_outer_dependency' if it has an array reference from
>> outside its own namespace.
>> * trans-array.c (gfc_conv_resolve_dependencies): If any ss is
>> marked as 'array_outer_dependency' generate a temporary.
>> (gfc_walk_function_expr): If the function is marked as
>> 'array_outer_dependency', likewise mark the head gfc_ss.
>>
>> 2015-02-10 Paul Thomas <pault@gcc.gnu.org>
>>
>> PR fortran/64952
>> * gfortran.dg/elemental_dependency_4.f90: New test
>> * gfortran.dg/elemental_dependency_5.f90: New test
>
--
Outside of a dog, a book is a man's best friend. Inside of a dog it's
too dark to read.
Groucho Marx
More information about the Fortran
mailing list