[fortran PATCH] Implement a(:,:) = 0.0 using memset
Tim Prince
timothyprince@sbcglobal.net
Mon Dec 18 19:33:00 GMT 2006
roger@eyesopen.com wrote:
> The following patch makes use of the recently added gfc_full_array_ref_p
> function to provide the optimization of using memset when assigning an
> entire array to zero. Currently, the source code below:
>
> integer :: a(20)
> a(:) = 0;
>
> we currently generate the following with -fdump-tree-original
>
> int8 S.0;
>
> S.0 = 1;
> while (1)
> {
> if (S.0 > 20) goto L.1; else (void) 0;
> (*a)[NON_LVALUE_EXPR <S.0> + -1] = 0;
> S.0 = S.0 + 1;
> }
> L.1:;
>
> with the patch below, we now generate this instead.
>
> (void) __builtin_memset ((void *) a, 0, 80);
>
>
> This can then take advantage of GCC's intrinsic expansion machinery,
> including Jan's recent improvements for x86. I'm keen to hear if there
> are any corner cases that I've overlooked and aren't covered by the
> gfortran
> testsuite. Perhaps if someone could run NIST, polyhedron and the usual
> suspects to confirm there are no issues.
>
> Once this is in the tree, and there are no major issues, there are some
> obvious extensions and improvements that can be made a follow-up patches:
> [1] Avoid using memset for small array sizes, such that the tree-ssa
> optimizers would unroll the loop and reveal the assignments via SRA.
> [2] Allow reverse order initialization, such as a(20:1:-1) = 0.
> [3] Extend the infrastructure to support sequentially consecutive
> assignments that don't cover the entire array a(20:40) = 0.0.
> [4] Extend infrastructure for arbitrary (run-time) length expressions,
> such as a(1:n) = 0.0.
> [5] Generalize this optimization to use memcpy (or memmove?) for array
> assignments, a(:) = b(:).
>
What can builtin_memset() do better than vectorized code, on platforms
which matter to you? Non-temporal store would be advantageous when the
array is larger than cache size, or will never be referenced while still
in cache, but will builtin_memset() be able to make such decisions
efficiently, if at all?
More information about the Fortran
mailing list