[LLVMdev] Problem to remove successors

Rasha Omar rasha.sala7 at gmail.com
Wed Jul 31 00:05:39 PDT 2013

Hi All,

I need to remove successors from every basic block to insert new ones

I tried this code, but it doesn't work

 void RemoveSuccessor(TerminatorInst *TI, unsigned SuccNum) {
    assert(SuccNum < TI->getNumSuccessors() &&
       "Trying to remove a nonexistant successor!");

    // If our old successor block contains any PHI nodes, remove the entry
in the
    // PHI nodes that comes from this branch...
    BasicBlock *BB = TI->getParent();

    TerminatorInst *NewTI = 0;
    switch (TI->getOpcode()) {
    case Instruction::Br:
      // If this is a conditional branch... convert to unconditional branch.
      if (TI->getNumSuccessors() == 2) {
      } else {                    // Otherwise convert to a return
        Value *RetVal = 0;

    // Create a value to return... if the function doesn't return null...
    if (!(BB->getParent()->getReturnType())->isVoidTy())
      RetVal = Constant::getNullValue(BB->getParent()->getReturnType());
    // Create the return...
    NewTI = 0;

    case Instruction::Invoke:    // Should convert to call
    case Instruction::Switch:    // Should remove entry
    case Instruction::Ret:       // Cannot happen, has no successors!
      assert(0 && "Unhandled terminator instruction type in

    if (NewTI)   // If it's a different instruction, replace.
      ReplaceInstWithInst(TI, NewTI);

Could you please help me to know where is the problem ?
Thank you

*     Rasha Salah Omar
     Msc Student at E-JUST
     Demonestrator  at Faculty of Computers and Informatics
     Benha University*

*     e-mail: rasha.omar at ejust.edu.eg*
 P* Please consider the environment before printing this email.*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130731/bc139606/attachment.html>

More information about the llvm-dev mailing list