[llvm] r340368 - [CodeGenPrepare] Scan past debug intrinsics to find select candidates (NFC)

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 27 17:56:11 PDT 2018


Looks like this is causing a crash - the pass later assumes that all the
select instructions discovered are contiguous.

This resulted in a crash later in CodeGenPrep because the last instruction
in the BB wasn't actually a terminator. A basic block ends like this (where
the select had been replaced by the branch, but then the llvm.dbg.value was
left after that select/br):

    br i1 %495, label ..., label ..., !dbg !251, !prof !252
    call void @llvm.dbg.value(metadata float ..., metadata !152, metadata
!DIExpression()), !dbg !241

(specifically, the backtrace is:

llvm::dyn_cast<llvm::ReturnInst, llvm::TerminatorInst> (Val=0x0) at
include/llvm/Support/Casting.h:334
CodeGenPrepare::dupRetToEnableTailCallOpts (...) at
lib/CodeGen/CodeGenPrepare.cpp:1794
CodeGenPrepare::optimizeBlock (... at lib/CodeGen/CodeGenPrepare.cpp:6703
CodeGenPrepare::runOnFunction (...) at lib/CodeGen/CodeGenPrepare.cpp:447

(the dyn_cast is passed zero because getTerminator() on the BB returns null
- because of the fact that it doesn't end with a terminator)

I'm going to revert this for now - do you think you'd need a test case from
me to reproduce this failure? I can try to reduce something from the
internal code that triggered this, but might take a bit of work - happy to
do so if you need it but I'm hoping the rough explanation will suffice to
get you to something useful faster than I can, given you've been poking
around in the code already recently.

Reverted in r340794

- Dave

On Tue, Aug 21, 2018 at 4:43 PM Vedant Kumar via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: vedantk
> Date: Tue Aug 21 16:42:38 2018
> New Revision: 340368
>
> URL: http://llvm.org/viewvc/llvm-project?rev=340368&view=rev
> Log:
> [CodeGenPrepare] Scan past debug intrinsics to find select candidates (NFC)
>
> In optimizeSelectInst, when scanning for candidate selects to rewrite
> into branches, scan past debug intrinsics. This makes the debug-enabled
> and non-debug paths through optimizeSelectInst more congruent.
>
> NFC because every select is eventually visited either way.
>
> Modified:
>     llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp
>
> Modified: llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp?rev=340368&r1=340367&r2=340368&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp (original)
> +++ llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp Tue Aug 21 16:42:38 2018
> @@ -5599,9 +5599,10 @@ bool CodeGenPrepare::optimizeSelectInst(
>    // Find all consecutive select instructions that share the same
> condition.
>    SmallVector<SelectInst *, 2> ASI;
>    ASI.push_back(SI);
> -  for (BasicBlock::iterator It = ++BasicBlock::iterator(SI);
> -       It != SI->getParent()->end(); ++It) {
> -    SelectInst *I = dyn_cast<SelectInst>(&*It);
> +  for (Instruction *NextInst = SI->getNextNonDebugInstruction();
> +       NextInst != SI->getParent()->getTerminator();
> +       NextInst = NextInst->getNextNonDebugInstruction()) {
> +    SelectInst *I = dyn_cast<SelectInst>(NextInst);
>      if (I && SI->getCondition() == I->getCondition()) {
>        ASI.push_back(I);
>      } else {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180827/c7172a26/attachment.html>


More information about the llvm-commits mailing list