[LLVMdev] Erasing dead blocks

Duncan Sands baldrick at free.fr
Fri Jan 7 00:33:27 PST 2011


Hi Gordan,

> I have a question regarding the IPSCCP class and the handling of dead blocks:
>
> The file lib/Transforms/Scalar/SCCP.cpp of llvm 2.8 from contains some
> code to deal with a dead block which could not be folded (line
> 1909ff). This happens when a user of this dead block is a branch or
> switch with an undef condition. The action taken than is to replace
> this terminator with an unconditional branch to the first successor of
> this undef branch/switch.
> I do not see how this ensures that the dead block is disconnected from
> the control flow graph. If the dead block is the first successor of
> the switch resp. branch the dead block will be still reachable after
> this code. Am I wrong here? Is there somewhere else code ensuring that
> the dead block is not the first successor of an undef branch/switch
> instruction?

I don't know much about SCCP, but I noticed that here a branch or switch on
undef causes SCCP to choose the *second* successor:

     // Check to see if we have a branch or switch on an undefined value.  If so
     // we force the branch to go one way or the other to make the successor
     // values live.  It doesn't really matter which way we force it.
     TerminatorInst *TI = BB->getTerminator();
     if (BranchInst *BI = dyn_cast<BranchInst>(TI)) {
       if (!BI->isConditional()) continue;
       if (!getValueState(BI->getCondition()).isUndefined())
         continue;

       // If the input to SCCP is actually branch on undef, fix the undef to
       // false.
       if (isa<UndefValue>(BI->getCondition())) {
         BI->setCondition(ConstantInt::getFalse(BI->getContext()));
         markEdgeExecutable(BB, TI->getSuccessor(1));
         return true;
       }
...

So in order to be consistent I would have expected the dead block erasing code
to also choose the second successor.  It looks like a bug to me.

Ciao, Duncan.



More information about the llvm-dev mailing list