public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "anlauf at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug fortran/102510] Function call has unnecessary stride check
Date: Tue, 28 Sep 2021 19:03:22 +0000	[thread overview]
Message-ID: <bug-102510-4-MmWWEXTdrJ@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-102510-4@http.gcc.gnu.org/bugzilla/>

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102510

--- Comment #3 from anlauf at gcc dot gnu.org ---
It helps to look at the (Fortran) context.  As written, the subroutine version
is declared with explicit size contiguous arrays.  If the caller has a
non-contiguous (strided) result array, it needs to pack/unpack.  For the
function version - as is - we might need a temporary to handle different
situations.

However, if you offer the compiler the chance to inline the calls, and using
optimization to inline the packing, you may get better code than you think.

Compile this example with -O3 -mavx:

module p
  use iso_fortran_env, only: r32 => real32
  real(r32), dimension(8)  :: a,b
  real(r32), dimension(8)  :: c1, c2
  real(r32), dimension(16) :: d1, d2
contains
  subroutine add2vecs1(a,b,c)
    real(r32), dimension(8), intent(in) :: a,b
    real(r32), dimension(8), intent(out) :: c
    c = a + b
  end subroutine add2vecs1
  function add2vecs2(a,b)
    real(r32), dimension(8), intent(in) :: a,b
    real(r32), dimension(8) :: add2vecs2
    add2vecs2 = a + b
  end function add2vecs2
  !-
  subroutine s1 ()
    call add2vecs1 (a, b, c1)
  end subroutine s1
  !-
  subroutine s2 ()
    c2         = add2vecs2 (a, b)
  end subroutine s2
  !-
  subroutine s3 ()
    call add2vecs1 (a, b, d1(1:16:2))
  end subroutine s3
  !-
  subroutine s4 ()
    d2(1:16:2) = add2vecs2 (a, b)
  end subroutine s4
end

You'll find that s1 and s2 compile to the same code, and the strided versions
s3 and s4 (at least this is my reading of the assembly, but correct me if I
am wrong).

Is there really more to expect?

  parent reply	other threads:[~2021-09-28 19:03 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-28  2:17 [Bug fortran/102510] New: Function call has unnecessary aliasing check dwwork at gmail dot com
2021-09-28  8:54 ` [Bug fortran/102510] Function call has unnecessary stride check rguenth at gcc dot gnu.org
2021-09-28 13:55 ` dwwork at gmail dot com
2021-09-28 19:03 ` anlauf at gcc dot gnu.org [this message]
2021-09-28 19:26 ` dwwork at gmail dot com
2021-09-29 21:01 ` anlauf at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-102510-4-MmWWEXTdrJ@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).