Regarding BasicBlock Cloning

Hi,

I am writing a pass for constant propagation using graph restructuring ( code duplication). I am facing following difficulties…

  1. I need to replicate the basic block but without phi function in the replicated block. How can I do this.

  2. I need to insert that basic block after and before some particular basic block.

Regards
Tarun Agrawal

This sounds a lot like jump threading, so you might want to take a
look at LLVM's lib/Transforms/Scalar/JumpThreading.cpp.

You probably want to use llvm::CloneBasicBlock from
Transforms/Utils/Cloning.h to get a cloned version of a block.
BasicBlock::splitBasicBlock might be useful as well.

-Eli

The clone llvm:CloneBasicBlock copies the phi function in the replicated basic block from the original basic block.
I don’t want the copy of phi in relplicated block. For now I am creating .bc file with -O0 option so that it doesn’t generate phi function in first place. Is this a good approach or there are some other function available for it.

Tarun

The clone llvm:CloneBasicBlock copies the phi function in the replicated basic block from the original basic block.

After you clone the basic block, you can probably replace the phi instruction with another value of your choice. If you’re adding variables, you’ll probably want to create them as allocas and use loads and stores to access them. In such as case, you’d replace the phi in the new BasicBlock with a load of your new variable.

Once all your basic blocks are in place and all the terminator instructions are modified so that your control-flow graph is the way you want it to be, you can run mem2reg to change your alloca variables into real SSA variables with phi-nodes in your new basic blocks.

– John T.

CloneBasicBlock isn't going to do anything magical... I pointed
towards BasicBlock::splitBasicBlock because I figured you could split
the PHIs out of the block you want to clone, or something like that.
Using DemotePHIToStack on PHI nodes to eliminate them is another
possibility.

Trying to do optimizations without running mem2reg is a really bad
idea for practical use: most optimization opportunities will be hidden
behind loads and stores to allocas.

-Eli

Thanks John I will try it…

Tarun

Splitting the basic block might not work for me but I think DemotePHIToStack will solve the problem…
Thanks for the reply.

Tarun