public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Segher Boessenkool <segher@kernel.crashing.org>
To: Richard Henderson <rth@redhat.com>
Cc: Jakub Jelinek <jakub@redhat.com>,
	       Richard Biener <richard.guenther@gmail.com>,
	Jeff Law <law@redhat.com>,
	       Richard Biener <rguenther@suse.de>,
	       Eric Botcazou <ebotcazou@adacore.com>,
	gcc-patches@gcc.gnu.org
Subject: Re: [PATCH] Reenable CSE of non-volatile inline asm (PR rtl-optimization/63637)
Date: Fri, 23 Jan 2015 22:53:00 -0000	[thread overview]
Message-ID: <20150123213940.GA17134@gate.crashing.org> (raw)
In-Reply-To: <54C2B495.2010009@redhat.com>

On Fri, Jan 23, 2015 at 12:52:37PM -0800, Richard Henderson wrote:
> > ./sysdeps/generic/malloc-machine.h:# define atomic_full_barrier() __asm ("" ::: "memory")
> 
> I think that it's uses like these -- which may well have been written
> by folks that also work on gcc -- that are proof that we have at least
> intended to support a memory clobber to be a full read+write barrier,
> and thus we must consider a memory clobber to be both a read and write.

I understand that argument.  But it is not what GCC actually does, nor
what I think it should do.  Consider this program:

--- 8< ---
int main(void)
{
	int x[100], y[100];

	x[31] = 42;

	asm("# eww %0" : "=m"(y[4]) : : "memory");

	return 0;
}
--- 8< ---

If "memory" would mean a read, the store to x[31] should not be considered
dead.  But it is, by all versions of GCC I have tried.

Because "memory" means a clobber of unspecified memory, all accesses *that
do happen* before it stay before it, and all accesses after it, after it.
It conflicts with all other memory accesses.  But it is a clobber, not an
output nor an input.

Here is another program:

--- 8< ---
int main(void)
{
	int x;

	asm("# eww %0" : "=r"(x) : : "memory");
	asm("# eww %0" : "=r"(x) : : "memory");

	return x;
}
--- 8< ---

If "memory" would imply a write and a read, the identical asm here could
not be CSEd.  But it is.

> (The fact that all of these are automatically volatile and would never be CSEd
> is beside the point.  If the semantics of a memory clobber differ based on the
> volatile flag on the asm, I think that would be too ill-defined to actually
> support.)

The semantics of the memory clobber do not change.  The semantics of the
asm as a whole do though: any volatile has to be executed on the real machine
as on the abstract machine.


You could argue (and it seems you do) that we should change the current
semantics of the "memory" clobber to do imply reading any memory; I argue
that that would be a bad idea, see the first example code.


Segher

  reply	other threads:[~2015-01-23 21:39 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-13 16:22 Jakub Jelinek
2015-01-13 17:06 ` Segher Boessenkool
2015-01-13 20:02   ` Jeff Law
2015-01-13 20:29     ` Jakub Jelinek
2015-01-13 22:28       ` Jeff Law
2015-01-14  3:44         ` Segher Boessenkool
2015-01-14  6:52           ` Jeff Law
2015-01-14 15:40             ` Segher Boessenkool
2015-01-15  6:46               ` Jeff Law
2015-01-15  7:54                 ` Richard Biener
2015-01-15  8:40                   ` Jakub Jelinek
2015-01-15  8:43                     ` Richard Biener
2015-01-15  9:50                     ` Jakub Jelinek
2015-01-15 18:22                     ` Jeff Law
2015-01-23 21:39                     ` Richard Henderson
2015-01-23 22:53                       ` Segher Boessenkool [this message]
2015-01-23 23:12                         ` Jakub Jelinek
2015-01-24  7:23                           ` Segher Boessenkool
2015-01-24 14:39                             ` Richard Sandiford
2015-01-13 22:42     ` Segher Boessenkool
2015-01-14  0:40       ` Segher Boessenkool
2015-01-14  7:12 ` Jeff Law

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=20150123213940.GA17134@gate.crashing.org \
    --to=segher@kernel.crashing.org \
    --cc=ebotcazou@adacore.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jakub@redhat.com \
    --cc=law@redhat.com \
    --cc=rguenther@suse.de \
    --cc=richard.guenther@gmail.com \
    --cc=rth@redhat.com \
    /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).