Edward Lee
2008-Oct-16 15:29 UTC
[LLVMdev] Requiring a pass to run before/after a pass? (Adding PHIs and updating uses)
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:
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20081016/d6464cb0/attachment.html>
Devang Patel
2008-Oct-16 16:24 UTC
[LLVMdev] Requiring a pass to run before/after a pass? (Adding PHIs and updating uses)
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
Edward Lee
2008-Oct-16 18:20 UTC
[LLVMdev] Requiring a pass to run before/after a pass? (Adding PHIs and updating uses)
On Thu, Oct 16, 2008 at 11:24 AM, Devang Patel <dpatel at apple.com> wrote:> One simplest way is to handle this is to add these passes around your > pass in the pass manager.How about in the context of opt assuming myOpt is built as part of llvm and not a separate plugin. It probably wouldn't be ideal to modify opt.cpp to do something like.. void addPass(PassManager &PM, Pass *P) { if (isa<myOpt>(P) { addPass(PM, beforePass); PM.add(P); addPass(PM, afterPass); } And even then, that only fixes opt. Perhaps Passes can get to the appropriate PassManager by going through Pass's virtual assignPassManager method? Ed
Seemingly Similar Threads
- [LLVMdev] Requiring a pass to run before/after a pass? (Adding PHIs and updating uses)
- optim seems to be finding a local minimum
- Enabling statistics in release builds / static constructors
- Enabling statistics in release builds / static constructors
- Enabling statistics in release builds / static constructors