On Mon, Nov 12, 2018 at 01:44:08PM -0600, Bill Schmidt wrote: > On 11/6/18 11:37 PM, Alan Modra wrote: > > + fun, "l" + sibcall); > > It's not at all clear to me what {"l" + sibcall} is doing here.
It's an ancient C programmer's trick, from the days when most compilers didn't optimize too well. I think I found it first in the nethack sources. :-) > Whatever it is, it's clever enough that it warrants a comment... :-) > Does adding "l" to false result in the null string? Is that > standard? "l" results in a "const char*" pointing at 0x6c,0 bytes in memory (assuming ascii). Adding "true" to that implicitly converts "true" to 1 and thus a "const char*" pointing at a NUL byte. All completely standard, even in that new fangled C++ thingy. A comment is as much needed as count++; needs /* add one to count. */. If it bothers people I'll write: sibcall ? "" : "l". Hah, even the latest gcc doesn't optimize the conditional expression down to "l" + sibcall. Check out the code generated for const char * f1 (bool x) { return "a" + x; } const char * f2 (bool x) { return x ? "" : "b"; } > > --- a/gcc/config/rs6000/rs6000.md > > +++ b/gcc/config/rs6000/rs6000.md > > @@ -10540,11 +10540,7 @@ (define_insn "*call_indirect_nonlocal_sysv<mode>" > > else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS) > > output_asm_insn ("creqv 6,6,6", operands); > > > > - if (rs6000_speculate_indirect_jumps > > - || which_alternative == 1 || which_alternative == 3) > > - return "b%T0l"; > > - else > > - return "crset 2\;beq%T0l-"; > > + return rs6000_output_indirect_call (operands, 0, false); > > Looks like this breaks Darwin? This pattern matches for DEFAULT_ABI == > ABI_DARWIN > but rs6000_output_indirect_call will hit gcc_unreachable() for that ABI. Hmm, yes, thanks for pointing that one out. I took too much notice of the pattern name. Segher, would you like me to repost the series with accumulated fixes, I mean before you review the rest of the series? -- Alan Modra Australia Development Lab, IBM