[llvm-dev] llc -O3 generates basic blocks that end without jump
Matt Arsenault via llvm-dev
llvm-dev at lists.llvm.org
Tue Feb 7 16:27:16 PST 2017
> On Feb 7, 2017, at 16:16, Alex Susu via llvm-dev <llvm-dev at lists.llvm.org> wrote:
> I noticed that when I pass the -O3 flag to llc some of the resulting ASM basic blocks (as seen by the AsmPrinter phase and the resulting .s file) don't contain any jump, be it conditional or unconditional. For example I get this ASM .s file after running llc -O3:
> // BB#0: // %entry
> mov r0, 0
> ld_64 r1, ...
> mov r2, 256
> // Notice there is no jump
> LBB0_1: // %for.cond2.preheader
> mov r3, 0
> These are not really 2 basic blocks, so the first block without jump should be merged with the successor block (if just one successor, which is always the case as far as I can see on the tests I ran).
> Did anybody already address such correction of "malformed" basic blocks obtained with llc -O3 (or -O1/O2)? Or is there any other flag that I am missing when invoking llc?
> Thank you,
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
BranchFolding will attempt to replace unconditional jumps with fallthroughs where applicable. A branch instruction is not needed at the end of a MachineBasicBlock. I’m not aware of anything that will attempt to merge these blocks into one (and I don’t see much of a reason to do this, there shouldn’t be much of difference in the final code unless maybe blocks are padded with nops for aligning them). There are a few situations where the branch label will be emitted even though there are no branches to that block. See where AsmPrinter::isBlockOnlyReachableByFallthrough is used
More information about the llvm-dev