From: Jan-Benedict Glaw <jbglaw@microdata-pos.de>
To: linux-kernel@vger.kernel.org
Subject: xchg and GCC's optimisation:-(
Date: Mon, 17 Dec 2001 13:45:26 +0100 [thread overview]
Message-ID: <20011217134526.A31801@microdata-pos.de> (raw)
Hi!
I recently posted a patch against 2.2.19 which eliminates most
printk()s by (in short words):
#define printk(format, arg...) do {} while(0)
However, I got trouble using the floppy driver, because
./kernel/dma.c:free_dma() seems to get miscompiled:
void free_dma(unsigned int dmanr)
{
if (dmanr >= MAX_DMA_CHANNELS) {
printk("Trying to free DMA%d\n", dmanr);
return;
}
if (xchg(&dma_chan_busy[dmanr].lock, 0) == 0) {
/* ERROR */ printk("Trying to free free DMA%d\n", dmanr);
return;
}
} /* free_dma */
Including a real_printk() at the line marked with ERROR will
result in:
00000088 <free_dma>:
88: 83 ec 0c sub $0xc,%esp
8b: 8b 54 24 10 mov 0x10(%esp,1),%edx
8f: 83 fa 07 cmp $0x7,%edx
92: 77 1e ja b2 <free_dma+0x2a>
94: 31 c0 xor %eax,%eax
96: 87 04 d5 00 00 00 00 xchg %eax,0x0(,%edx,8)
9d: 85 c0 test %eax,%eax
9f: 75 11 jne b2 <free_dma+0x2a>
a1: 83 c4 f8 add $0xfffffff8,%esp
a4: 52 push %edx
a5: 68 11 00 00 00 push $0x11
aa: e8 fc ff ff ff call ab <free_dma+0x23>
af: 83 c4 10 add $0x10,%esp
b2: 83 c4 0c add $0xc,%esp
b5: c3 ret
b6: 8d 76 00 lea 0x0(%esi),%esi
b9: 8d bc 27 00 00 00 00 lea 0x0(%edi,1),%edi
...which is fine and contains the needed xchg call. However,
substituting the printk() with "do {} while (0)" above,
the "if" path seems to be completely removed by the optimizer:
00000088 <free_dma>:
88: c3 ret
89: 8d b4 26 00 00 00 00 lea 0x0(%esi,1),%esi
I've looked at ./include/asm-i386/system.h which does some black
magic with it, and I don't really understand that. However, the
result is that the xchg gets optimized away, rendering at least
the floppy module unuseable:-(
MfG, JBG
next reply other threads:[~2001-12-17 12:46 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-12-17 12:45 Jan-Benedict Glaw [this message]
2001-12-17 13:18 ` xchg and GCC's optimisation:-( Momchil Velikov
2001-12-17 13:55 ` Jan-Benedict Glaw
2001-12-17 17:33 ` vda
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=20011217134526.A31801@microdata-pos.de \
--to=jbglaw@microdata-pos.de \
--cc=linux-kernel@vger.kernel.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