[LLVMdev] Requiring a pass to run before/after a pass? (Adding PHIs and updating uses)
Devang Patel
dpatel at apple.com
Thu Oct 16 09:24:20 PDT 2008
On Oct 16, 2008, at 8:29 AM, Edward Lee wrote:
> Is there a simple way to require a pass, e.g., Reg2Mem/Mem2Reg, to
> run before/after my transformation pass? Or do I do something like:
One simplest way is to handle this is to add these passes around your
pass in the pass manager.
pm.add(Reg2Mem)
pm.add(MyPass)
pm.add(Mem2Reg)
>
>
> struct myOpt {
> myOpt() {
> mBefore = createDemoteRegisterToMemoryPass();
> mAfter = createPromoteMemoryToRegisterPass();
> }
>
> getAnalysisUsage(AU) {
> AU.addRequired(my stuff);
> mBefore.getAnalysisUsage(AU);
> mAfter.getAnalysisUsage(AU);
> }
>
> runOnFunction(aF) {
> changed = mBefore(F);
> do my stuff;
> changed |= mAfter(F);
> }
> }
>
> I'm trying to transform a CFG where A flows into B and C, and I'm
> making a copy of A, A_copy, which will also flow into B and C. Right
> now I'm making a merge point mergeB where both A and A_copy flow
> into it, and it then flows into B. Same for C.
>
> A
> / \
> B C
>
>
> A A_copy
> | / \ |
> mergeB mergeC
> | |
> B C
>
> For any values %v deffed in A and A_copy, mergeB has the phis
> %v.phi.B, and I replace the original uses of %v in B with %v.phi.B.
> However, if both B and C use %v, I need to make sure B gets updated
> to use %v.phi.B and C gets %v.phi.C (and not %v.phi.B).
>
> I figured I could maybe make the code cleaner by pushing values into
> alloca slots then doing my transformation and converting back to
> registers with Reg2Mem then Mem2Reg.
>
> Ed
>
> _______________________________________________
> 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