[LLVMdev] Problem to remove successors

Duncan Sands baldrick at free.fr
Thu Aug 1 07:47:19 PDT 2013


Hi,

On 31/07/13 09:05, Rasha Omar wrote:
> Hi All,
>
> I need to remove successors from every basic block to insert new ones
>
> I tried this code, but it doesn't work

take a look in include/llvm/Transforms/Utils/BasicBlockUtils.h, for example
SplitBlock.  After running SplitBlock to split off the existing terminator,
it should be easy to then transform the IR into what you want.

Ciao, Duncan.

>
>
>   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();
>      TI->getSuccessor(SuccNum)->removePredecessor(BB);
>
>      TerminatorInst *NewTI = 0;
>      switch (TI->getOpcode()) {
>      case Instruction::Br:
>        // If this is a conditional branch... convert to unconditional branch.
>        if (TI->getNumSuccessors() == 2) {
>      cast<BranchInst>(TI)->setUnconditionalDest(TI->getSuccessor(1-SuccNum));
>        } else {                    // Otherwise convert to a return instruction...
>          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;
>        }
>        break;
>
>      case Instruction::Invoke:    // Should convert to call
>      case Instruction::Switch:    // Should remove entry
>      default:
>      case Instruction::Ret:       // Cannot happen, has no successors!
>        assert(0 && "Unhandled terminator instruction type in RemoveSuccessor!");
>        abort();
>      }
>
>      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 <mailto:rasha.omar at ejust.edu.eg>*
>
> P* Please consider the environment before printing this email.*
>
>
>
> _______________________________________________
> 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