[LLVMdev] Requiring a pass to run before/after a pass? (Adding PHIs and updating uses)
Edward Lee
eslee3 at uiuc.edu
Thu Oct 16 08:29:09 PDT 2008
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>
More information about the llvm-dev
mailing list