public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "rguenther at suse dot de" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug middle-end/104800] reodering of potentially trapping operations and volatile stores
Date: Wed, 09 Mar 2022 07:52:50 +0000	[thread overview]
Message-ID: <bug-104800-4-5atK3iEqhn@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-104800-4@http.gcc.gnu.org/bugzilla/>

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

--- Comment #13 from rguenther at suse dot de <rguenther at suse dot de> ---
On Wed, 9 Mar 2022, muecker at gwdg dot de wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104800
> 
> --- Comment #11 from Martin Uecker <muecker at gwdg dot de> ---
> (In reply to Richard Biener from comment #9)
> > (In reply to Martin Uecker from comment #8)
> > > The standard specifies in 5.1.2.3p6 that
> > > 
> > > "— Volatile accesses to objects are evaluated strictly
> > > according to the rules of the abstract machine."
> > > 
> > > and
> > > 
> > > "This is the observable behavior of the program."
> > > 
> > > 
> > > If a trap is moved before a volatile access so that the access never
> > > happens, than this changes the observable behavior because the volatile
> > > access was then not evaluated strictly according to the abstract machine.
> > 
> > Well, the volatile access _was_ evaluated strictly according to the abstract
> > machine. 
> 
> Not if there is a trap.
> 
> > Can't your argument be stretched in a way that for
> > 
> >  global = 2;
> >  *volatile = 1;
> > 
> > your reasoning says that since the volatile has to be evaluated strictly
> > according to the abstract machine that the full abstract machine status
> > has to be reflected at the point of the volatile and thus the write of
> > the global (non-volatile) memory has to be observable at that point
> > and so we may not move accesses to global memory across (earlier or later)
> > volatile accesses?
> 
> The state of the global variables is not directly observable.
> 
> > IMHO the case with the division is similar, you just introduce the extra
> > twist of a trap.
> 
> The point is that the trap prevents the volatile store to happen.
> 
> > The two volatile accesses in your example are still evaluated according
> > to the abstract machine, just all non-volatile (and non-I/O) statements
> > are not necessarily.
> 
> The problem is that the volatile store might not be evaluated if there is a
> trap.

So?  The abstract machine evaluation simply does not have reached the
second volatile store then.  All indirect memory accesses might trap
(again undefined behavior), direct stores might trap if they are
mapped to readonly memory (again undefined behavior).  General
FP operations might trap (sNaNs), other general operations might trap
(certain CPU insns trap on overflow, some CPUs have NaTs that trap, etc.).

I'm raising these issues because while the case at hand (division
by zero trap and volatiles) might be an obvious candidate to "fix"
just for the sake of QOI the question is where to stop?

Take

volatile flag;
void foo (int *p)
{
  if (p == NULL)
    {
      flag = 1;
      *p = 1;
    }
}

it's an artifact that we currently fail to eliminate the branch
because it leads to UB *p = 1, and I think it would be valid to
eliminate it.  Would that be in violation of your desired
reading of the standard since it elides the volatile store
(the UB happens later)?

  parent reply	other threads:[~2022-03-09  7:52 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-05 18:46 [Bug tree-optimization/104800] New: " muecker at gwdg dot de
2022-03-05 18:50 ` [Bug tree-optimization/104800] " muecker at gwdg dot de
2022-03-05 21:07 ` pinskia at gcc dot gnu.org
2022-03-06  5:04 ` [Bug middle-end/104800] " paulmckrcu at gmail dot com
2022-03-06  6:46 ` muecker at gwdg dot de
2022-03-06  6:54 ` muecker at gwdg dot de
2022-03-07  8:52 ` rguenth at gcc dot gnu.org
2022-03-07 17:47 ` paulmckrcu at gmail dot com
2022-03-08 20:27 ` muecker at gwdg dot de
2022-03-09  7:26 ` rguenth at gcc dot gnu.org
2022-03-09  7:29 ` rguenth at gcc dot gnu.org
2022-03-09  7:40 ` muecker at gwdg dot de
2022-03-09  7:42 ` muecker at gwdg dot de
2022-03-09  7:52 ` rguenther at suse dot de [this message]
2022-03-09  8:06 ` rguenther at suse dot de
2022-03-09  9:05 ` muecker at gwdg dot de
2022-03-09  9:10 ` muecker at gwdg dot de

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-104800-4-5atK3iEqhn@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).