Maybe GAS could recognize -fno-delayed-branch to selectively disable branch slot filling?
Is there a list of optimizations performed by MIPS GAS listed somewhere? It would be nice if these could be selectively enabled. Toshi --- On Thu, 5/19/11, Richard Sandiford <rdsandif...@googlemail.com> wrote: > From: Richard Sandiford <rdsandif...@googlemail.com> > Subject: Re: mips-elf-gcc -fno-delayed-branch problem > To: "Toshi Morita" <tm314...@yahoo.com> > Cc: gcc@gcc.gnu.org > Date: Thursday, May 19, 2011, 1:03 AM > Toshi Morita <tm314...@yahoo.com> > writes: > > There's a problem where compiling code with > -fno-delayed-branch still > > fills branch delay slots. > > [...] > > The problem appears to be caused with GNU AS. It now > has the > > capability to reorder instructions, and there is no > ".set noreorder" > > emitted by the compiler, so the assembler fills the > branch delay slot. > > FWIW, I think this was a deliberate historical > choice. But... > > > So when the -fno-delayed-branch switch is passed to > mips-elf-gcc, a > > ".set noreorder" directive should be emitted into the > assembly file. > > The problem is that ".set noreorder" has other side-effects > too, > such as stopping the assembler from inserting nops to avoid > data > hazards, or to work around errata. There are various > situations > in which we can't rely on GCC to insert these nops, and in > which > GCC must therefore treat the function as ".set reorder". > > One of those situations is when the function has inline > asm, as in > your example. GCC doesn't know what the inline asm > does, so it also > doesn't know what nops would be needed between the asm and > the > GCC-generated code, or within the asm code itself. > Another situation > is when compiling with -mno-explicit-relocs or with various > -mfix-* > options. While those are somewhat niche options, it'd > be inconsistent > to "guarantee" that -fno-delayed-branch emits everything as > ".set noreorder" > except when those options are used. > > At the moment, the way to force no delayed branches is to > use: > > -fno-delayed-branch -Wa,-O0 > > Maybe it would be worth breaking with tradition and making > -fno-delayed-branch imply -Wa,-O0 though. Back in the > day, > the assembler's version of delayed-branch filling was > applied > to pretty much every function, so the separation was > probably > more obvious. However, CCC now tries to emit most > functions as > ".set noreorder"/ ".set nomacro", so -fno-delayed-branch > does > actually stop the assembler filling branches in most > situations. > I can see that it'd be confusing to suddenly have the > assembler > kick in when you add something like an inline asm. > > So yeah, I'll try to get around to that this weekend... > > Richard >