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