From: Trent Piepho <xyzzy@speakeasy.org>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Nick Piggin <nickpiggin@yahoo.com.au>,
Satyam Sharma <ssatyam@cse.iitk.ac.in>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
David Howells <dhowells@redhat.com>, Andi Kleen <ak@suse.de>,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH 6/8] i386: bitops: Don't mark memory as clobbered unnecessarily
Date: Wed, 25 Jul 2007 18:07:15 -0700 (PDT) [thread overview]
Message-ID: <Pine.LNX.4.58.0707251731370.30561@shell4.speakeasy.net> (raw)
In-Reply-To: <alpine.LFD.0.999.0707241236020.3607@woody.linux-foundation.org>
On Tue, 24 Jul 2007, Linus Torvalds wrote:
> On Tue, 24 Jul 2007, Trent Piepho wrote:
> >
> > Speaking of that, why are all the asm functions in arch/i386/lib/string.c
> > defined as having a memory clobber, even those which don't modify memory
> > like strcmp, strchr, strlen and so on?
>
> That's because the memory clobber will serialize the inline asm with
> anything else that reads or writes memory.
>
> So even if we don't actually change any memory, if we cannot describe what
> we *read*, then we need to tell gcc to not re-order us wrt things that
> could *write*. And the simplest way to do that is to say that you clobber
> memory, even if you don't.
I went a made a test suite to see what really happened, and this isn't how
it works. It appears that a memory clobber only tells gcc that the asm
writes to memory. It does _not_ tell gcc that the asm reads from memory.
It's at http://www.speakeasy.org/~xyzzy/download/opttest.tar.gz
It's only 3k, but there are 16 files so I'm not inlining it.
The suite has a few test c files, which are compiled with various different
functions, inline norm asm, inline volatile asm, inline asm with a memory
clobber, a normal function, a __attribute__((const)) function, and so on.
They are compiled to asm file, and then a perl script scans the asm files to
figure out what optimizations gcc made.
"make test" will compile all the tests and run them through the perl scripts.
"make test1" will just run test1, etc.
It appears that a normal asm, one without volatile or a memory clobber, is
treated like a const function, which returns the output via a struct (not
using pass-by-address). It has no side-effects, can't read or write global
variables, and can't dereference pointer arguments.
Adding volatile tells gcc the asm has some hidden side-effect. It still can't
r/w globals or dereference inputs. But it won't get elided if there are no
used outputs, common subexpression merged, or treated as a loop invariant.
Adding a memory clobber tells gcc that the asm modifies memory. It doesn't
modify un-aliased local variables in registers. It does modify aliased local
variables. It does not read from memory. gcc will move or elide a memory
write before an asm with a memory clobber if nothing else (besides the asm)
could see the write. A memory clobber doesn't count as a side-effect either,
a non-volatile asm without unused outputs will be elided, even if has a memory
clobber.
Specifically, check test6_memasm.s. The C code looks like this:
extern int a; /* keep asm from being elided for having no used output */
static inline void bar(void) { asm("call bar" : "=m"(a) : : "memory"); }
/* float x can't alias asm's output int a */
void foo(float *x) { x[20] = 1; bar(); x[20] = 2; }
The asm code ends up like this:
foo:
call bar
movl 4(%esp), %eax # x, x
movl $0x40000000, 80(%eax) #,
ret
Notice that the first write to x[20] was NOT done. It's also not done for a
volatile asm without a memory clobber. But if you combine both volatile and a
memory clobber, then it is! How to explain that?
The difference between test2_volasm.s and test2_normasm.s is hard to explain
too. It seems like some times gcc forgets that imull is commutative. It will
emit "imull %edx, %eax" in some cases, but change an asm slightly and it will
decide it must do "imull %eax, %edx ; movl %edx, %eax" for no apparent reason.
next prev parent reply other threads:[~2007-07-26 1:07 UTC|newest]
Thread overview: 92+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-07-23 16:05 [PATCH 0/8] i386: bitops: Cleanup, sanitize, optimize Satyam Sharma
2007-07-23 16:05 ` [PATCH 1/8] i386: bitops: Update/correct comments Satyam Sharma
2007-07-23 16:05 ` [PATCH 2/8] i386: bitops: Rectify bogus "Ir" constraints Satyam Sharma
2007-07-23 16:10 ` Andi Kleen
2007-07-23 16:21 ` Satyam Sharma
2007-07-23 16:30 ` Andi Kleen
2007-07-23 16:36 ` Jan Hubicka
2007-07-23 18:05 ` H. Peter Anvin
2007-07-23 18:28 ` H. Peter Anvin
2007-07-23 17:57 ` Linus Torvalds
2007-07-23 18:14 ` Satyam Sharma
2007-07-23 18:32 ` Andi Kleen
2007-07-23 18:39 ` H. Peter Anvin
2007-07-23 18:52 ` Satyam Sharma
2007-07-23 16:05 ` [PATCH 3/8] i386: bitops: Rectify bogus "+m" constraints Satyam Sharma
2007-07-23 16:37 ` Andi Kleen
2007-07-23 17:15 ` Satyam Sharma
2007-07-23 17:46 ` Linus Torvalds
2007-07-24 9:22 ` David Howells
2007-07-23 16:05 ` [PATCH 4/8] i386: bitops: Kill volatile-casting of memory addresses Satyam Sharma
2007-07-23 17:52 ` Linus Torvalds
2007-07-24 4:19 ` Nick Piggin
2007-07-24 6:23 ` Satyam Sharma
2007-07-24 7:16 ` Nick Piggin
2007-07-24 9:49 ` Benjamin Herrenschmidt
2007-07-24 17:20 ` Linus Torvalds
2007-07-24 17:39 ` Jeff Garzik
2007-07-25 4:54 ` Nick Piggin
2007-07-23 16:05 ` [PATCH 5/8] i386: bitops: Contain warnings fallout from the death of volatiles Satyam Sharma
2007-07-23 16:05 ` [PATCH 6/8] i386: bitops: Don't mark memory as clobbered unnecessarily Satyam Sharma
2007-07-23 16:13 ` Andi Kleen
2007-07-23 16:26 ` Satyam Sharma
2007-07-23 16:33 ` Andi Kleen
2007-07-23 17:12 ` Satyam Sharma
2007-07-23 17:49 ` Jeremy Fitzhardinge
2007-07-23 17:55 ` Linus Torvalds
2007-07-24 9:52 ` Benjamin Herrenschmidt
2007-07-24 17:24 ` Linus Torvalds
2007-07-24 17:42 ` Trond Myklebust
2007-07-24 18:13 ` Linus Torvalds
2007-07-24 18:28 ` Trond Myklebust
2007-07-24 21:37 ` Benjamin Herrenschmidt
2007-07-24 21:55 ` Trond Myklebust
2007-07-24 22:32 ` Benjamin Herrenschmidt
2007-07-25 4:10 ` Nick Piggin
2007-07-24 21:36 ` Benjamin Herrenschmidt
2007-07-24 3:57 ` Nick Piggin
2007-07-24 6:38 ` Satyam Sharma
2007-07-24 7:24 ` Nick Piggin
2007-07-24 8:29 ` Satyam Sharma
2007-07-24 8:39 ` Nick Piggin
2007-07-24 8:38 ` Trent Piepho
2007-07-24 19:39 ` Linus Torvalds
2007-07-24 20:37 ` Andi Kleen
2007-07-24 20:08 ` Linus Torvalds
2007-07-24 21:31 ` Jeremy Fitzhardinge
2007-07-24 21:46 ` Linus Torvalds
2007-07-26 1:07 ` Trent Piepho [this message]
2007-07-26 1:18 ` Linus Torvalds
2007-07-26 1:22 ` Linus Torvalds
2007-07-24 9:44 ` David Howells
2007-07-24 10:02 ` Satyam Sharma
2007-07-23 16:06 ` [PATCH 7/8] i386: bitops: Kill needless usage of __asm__ __volatile__ Satyam Sharma
2007-07-23 16:18 ` Andi Kleen
2007-07-23 16:22 ` [PATCH 7/8] i386: bitops: Kill needless usage of __asm__ __volatile__ II Andi Kleen
2007-07-23 16:32 ` [PATCH 7/8] i386: bitops: Kill needless usage of __asm__ __volatile__ Satyam Sharma
2007-07-23 16:23 ` Jeremy Fitzhardinge
2007-07-23 16:43 ` Satyam Sharma
2007-07-23 17:39 ` Jeremy Fitzhardinge
2007-07-23 18:07 ` Satyam Sharma
2007-07-23 18:28 ` Jeremy Fitzhardinge
2007-07-23 20:29 ` Trent Piepho
2007-07-23 20:40 ` Jeremy Fitzhardinge
2007-07-23 21:06 ` Trent Piepho
2007-07-23 21:30 ` Andi Kleen
2007-07-23 21:48 ` Nicholas Miell
2007-07-23 16:06 ` [PATCH 8/8] i386: bitops: smp_mb__{before, after}_clear_bit() definitions Satyam Sharma
2007-07-24 3:53 ` Nick Piggin
2007-07-24 7:34 ` Satyam Sharma
2007-07-24 7:48 ` Jeremy Fitzhardinge
2007-07-24 8:31 ` Nick Piggin
2007-07-24 8:20 ` Nick Piggin
2007-07-24 9:21 ` Satyam Sharma
2007-07-24 10:25 ` Nick Piggin
2007-07-24 11:10 ` Satyam Sharma
2007-07-24 11:32 ` Nick Piggin
2007-07-24 11:45 ` Satyam Sharma
2007-07-24 12:01 ` Nick Piggin
2007-07-24 17:12 ` Linus Torvalds
2007-07-24 19:01 ` Satyam Sharma
2007-07-30 17:57 ` [PATCH 0/8] i386: bitops: Cleanup, sanitize, optimize Denis Vlasenko
2007-07-31 1:07 ` Satyam Sharma
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=Pine.LNX.4.58.0707251731370.30561@shell4.speakeasy.net \
--to=xyzzy@speakeasy.org \
--cc=ak@suse.de \
--cc=akpm@linux-foundation.org \
--cc=dhowells@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=nickpiggin@yahoo.com.au \
--cc=ssatyam@cse.iitk.ac.in \
--cc=torvalds@linux-foundation.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
all inboxes | Powered by JetHome®