[LLVMdev] How to check for "SPARC code generation" in MachineBasicBlock.cpp?
Jürgen Zimmermann
Juergen.Zimmermann at Sun.COM
Tue Feb 9 00:06:32 PST 2010
Chris,
thanks for that in-depth explaination.
I like your idea making isOnlyReachableByFallthrough making a
virtual function and then overwrite it in the SPARC backend
for our purpose.
That way, I guess I would get a complete and clean bootstrap of LLVM/GCC
4.2 on SPARC in 32 bit (for now).
Let me see what I can do later.
Regards,
Juergen
Am 08.02.2010 18:57, schrieb Chris Lattner:
> On Feb 8, 2010, at 12:37 AM, Nathan Keynes wrote:
>> Firstly, the BNE/BA pair should be reduced to a BE (I assume this is
>> the responsibility of AnalyzeBranch and friends that you mention).
>
> Right. Implementing AnalyzeBranch will allow a bunch of block layout
> and branch optimizations to happen.
>
>> However I still wouldn't have expected that to result in the label
>> being omitted (assuming multiple branches are legal in an MBB). It
>> appears that the branch delay-slots are specifically to blame here
>
> Yes, most certainly.
>
>> - the above BB#315 immediately prior to output is
>>
>> BB#7: derived from LLVM BB %bb
>> Live Ins: %L1 %L0 %L3 %L2 %L4
>> Predecessors according to CFG: BB#6
>> %L5<def> = SETHIi 1856
>> %L6<def> = ORri %G0, 1
>> %L3<def> = SLLrr %L6<kill>, %L3<kill>
>> %L5<def> = ORri %L5<kill>, 1
>> %L3<def> = ANDrr %L3<kill>, %L5<kill>
>> %L3<def,dead> = SUBCCri %L3<kill>, 0, %ICC<imp-def>
>> BCOND<BB#8>, 9, %ICC<imp-use,kill>
>> NOP
>> BA<BB#68>
>> NOP
>>
>> which leads MachineBasicBlock::isOnlyReachableByFallthrough() to
>> return TRUE for BB#8, since the final NOP is not a 'barrier
>> instruction', and so the label is skipped.
>
> Yep, that sounds like the problem.
>
>> So I guess the question I have is, are MBBs like BB#7 above legal,
>
> Funny question :). When I was working on the sparc backend, it was
> unclear how best to represent delay slots. The approach I took was to
> pretend that they didn't exist for most of the compiler backend, then
> have DelaySlotFiller create them right before the asmprinter ran. The
> idea was to eventually extend DelaySlotFiller to put something better
> than a nop in them :)
>
> This all works as long as the asmprinter is a simple pass through that
> doesn't look at the code, which isOnlyReachableByFallthrough violates.
>
> As far as a proposed solution, since asmprinter is the only user of
> isOnlyReachableByFallthrough, I'd recommend moving
> isOnlyReachableByFallthrough to be
> AsmPrinter::IsBlockOnlyReachableByFallthrough. Then you can make it
> virtual, and have the sparc backend provide its own implementation of
> it (which might as well just return false all the time).
>
>> and if so would something like
>>
>> BB#7:
>> ...
>> BCOND cond1, BB#8
>> BCOND cond2, BB#57
>> BB#8:
>> ...
>> also be legal - ie BB7 contains both a branch and a fallthrough to
>> the same successor block?
>
> That form is legal, but not desirable because AnalyzeBranch isn't able
> to model it. This will cause a bunch of useful optimizations to get
> disabled.
>
> -Chris
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list