public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "rguenth at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug fortran/102043] [9/10/11/12 Regression] Wrong array types used for negative stride accesses, gfortran.dg/vector_subscript_1.f90  FAILs
Date: Mon, 28 Mar 2022 12:16:28 +0000	[thread overview]
Message-ID: <bug-102043-4-xlxZl8PUUq@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-102043-4@http.gcc.gnu.org/bugzilla/>

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

--- Comment #37 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to rguenther@suse.de from comment #36)
> On Sun, 27 Mar 2022, mikael at gcc dot gnu.org wrote:
> 
> > For gcc-12, is there a way to add a middle-end workaround using annotations on
> > descriptor types (a lang flag or something) ?
> 
> I will think of what options we have to work around this in the
> middle-end (maybe with help of the frontend during gimplification).

So the difficult issue is that the intended effect of the ARRAY_REF is to
apply a negative offset to its base.  That's something fundamentally not
supported for any handled component reference, especially when it is a
non-constant negative offset.  An access is currently constrained to
[offset, offset + max_size] where max_size can be unknown (we use a special
value of -1 for that).  In particular 'offset' cannot be unknown, but when
we split the ultimate base object we do support a constant negative offset
from the real base object.  So we consider a get_base_address() base
plus [0, 0 + unknown] to be a valid conservative answer - but for the
fortran ARRAY_REF indexing it would not be!

Now - actual miscompilations of course require more specific setups, the
ones cited here take advantage of knowing the size of the underlying object
and together with the offset >= 0 constraint constraining the variable index
to exactly the last element of the array.  We already have
-funconstrained-commons to catch a similar case (but with trailing arrays
here).

On the middle-end side it's hard to tell whether the actual array
reference is from a "safe" one (not via an array descriptor and not with
negative stride), so truly fixing it there with lowering the ARRAY_REF
to pointer arithmetic would be a mass-rewrite of even safe accesses.

Another effect besides the wrong constant propagation would be
disambiguation of accesses.  Like if we had

  integer, dimension (10) :: a
  do i = 1, 10
    reshape(a, (/10:1:-1/))(i) = a(i)
  end do

(sorry for my likely invalid fortran, but you get the idea), then
the middle-end would disambiguate all a(i) besides a(10) against the
store.

To sum up, I don't see a good way to workaround this in the middle-end
(without a really big hammer that would do more harm than good).  I also
do not see a way to teach the middle-end negative offsetting ARRAY_REFs,
even if you'd call them differently.

The issue itself is long latent so we probably have to live with GCC 12
exposing slightly more cases of it in the real world (I have yet to see
one there).

  parent reply	other threads:[~2022-03-28 12:16 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-24 14:18 [Bug fortran/102043] New: Wrong array types used for negative stride accesses rguenth at gcc dot gnu.org
2021-08-25  8:42 ` [Bug fortran/102043] " rguenth at gcc dot gnu.org
2021-08-25  9:16 ` rguenth at gcc dot gnu.org
2021-08-25 10:05 ` ebotcazou at gcc dot gnu.org
2021-08-25 10:07 ` rguenth at gcc dot gnu.org
2021-08-25 10:20 ` rguenth at gcc dot gnu.org
2021-09-30 19:56 ` anlauf at gcc dot gnu.org
2021-11-08 21:23 ` hubicka at gcc dot gnu.org
2021-11-10 16:31 ` mikael at gcc dot gnu.org
2021-11-10 17:12 ` aldot at gcc dot gnu.org
2021-11-11  8:00 ` rguenth at gcc dot gnu.org
2021-11-12 18:14 ` tkoenig at gcc dot gnu.org
2021-11-12 19:30 ` mikael at gcc dot gnu.org
2021-11-14  7:57 ` tkoenig at gcc dot gnu.org
2021-11-14  9:33 ` mikael at gcc dot gnu.org
2021-11-14  9:38 ` tkoenig at gcc dot gnu.org
2021-11-14 16:07 ` aldot at gcc dot gnu.org
2021-11-14 16:18 ` aldot at gcc dot gnu.org
2021-11-14 17:00 ` mikael at gcc dot gnu.org
2021-11-14 17:13 ` mikael at gcc dot gnu.org
2021-11-14 19:42 ` tkoenig at gcc dot gnu.org
2021-11-15 10:47 ` rguenth at gcc dot gnu.org
2021-11-19 18:21 ` mikael at gcc dot gnu.org
2021-11-19 18:31 ` mikael at gcc dot gnu.org
2021-11-22  7:46 ` rguenther at suse dot de
2021-11-22 22:33 ` hubicka at gcc dot gnu.org
2021-11-27 21:43 ` mikael at gcc dot gnu.org
2021-12-11 17:47 ` mikael at gcc dot gnu.org
2021-12-11 17:53 ` mikael at gcc dot gnu.org
2021-12-12 17:04 ` mikael at gcc dot gnu.org
2021-12-12 21:26 ` mikael at gcc dot gnu.org
2022-01-03  9:09 ` rguenth at gcc dot gnu.org
2022-01-03  9:12 ` rguenth at gcc dot gnu.org
2022-03-24  9:39 ` [Bug fortran/102043] [9/10/11/12 Regression] Wrong array types used for negative stride accesses, gfortran.dg/vector_subscript_1.f90 FAILs rguenth at gcc dot gnu.org
2022-03-24 16:40 ` tschwinge at gcc dot gnu.org
2022-03-27 19:36 ` mikael at gcc dot gnu.org
2022-03-28  6:36 ` rguenther at suse dot de
2022-03-28 12:16 ` rguenth at gcc dot gnu.org [this message]
2022-03-28 12:24 ` burnus at gcc dot gnu.org
2022-03-30  6:45 ` tkoenig at gcc dot gnu.org
2022-03-30  6:48 ` rguenther at suse dot de
2022-03-30  9:07 ` rguenth at gcc dot gnu.org
2022-03-30 11:22 ` rguenth at gcc dot gnu.org
2022-04-05 10:21 ` mikael at gcc dot gnu.org
2022-04-22 20:53 ` cvs-commit at gcc dot gnu.org
2022-04-22 20:53 ` cvs-commit at gcc dot gnu.org
2022-04-22 20:53 ` cvs-commit at gcc dot gnu.org
2022-04-22 20:53 ` cvs-commit at gcc dot gnu.org
2022-04-25  6:07 ` [Bug fortran/102043] [9/10/11 " rguenth at gcc dot gnu.org
2022-04-27  9:36 ` cvs-commit at gcc dot gnu.org
2022-05-27  9:46 ` [Bug fortran/102043] [10/11 " rguenth at gcc dot gnu.org
2022-06-28 10:46 ` jakub at gcc dot gnu.org
2022-08-28 10:36 ` mikael at gcc dot gnu.org
2022-08-28 10:37 ` mikael at gcc dot gnu.org
2023-07-07 10:40 ` [Bug fortran/102043] [11 " rguenth 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-102043-4-xlxZl8PUUq@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).