Problem to remove successors

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();
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(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

Hi,

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.