Hi All, Still I could not figure out how to use Pass* while calling SplitEdge() function. Can anyone provide me some example? Regards, Chayan On Sun, Jul 18, 2010 at 11:49 PM, Nick Lewycky <nicholas at mxc.ca> wrote:> Chayan Sarkar wrote: >> >> Hi, >> >> I have tried to use SplitEdge function, but failed. Actually the third >> parameter is a variable of type Pass and it need to be non-null. But I >> could not figure out how to use it. Please help me out. > > The only reason it needs a non-NULL Pass* is to call llvm::SplitBlock which > uses P->getAnalysisIfAvailable unconditionally. Feel free to wrap those > calls in 'if (P) { ... }' and send us a patch. > > Of course, the obvious question is why aren't you doing your transforms > inside of a Pass? > > Nick > >> Regards, >> Chayan >> >> On Sat, Jul 17, 2010 at 10:16 PM, Nick Lewycky<nicholas at mxc.ca> wrote: >>> >>> Chayan Sarkar wrote: >>>> >>>> Hi all, >>>> >>>> Suppose in a CFG bb1 has two succesor bb3 and bb4, and bb3 has two >>>> predecessor bb1 and bb2. Now how can I insert a basic block between >>>> bb1 and bb3 that at the edge bb1-->bb3 . >>>> >>>> In general how can I insert a basic block on an edge? >>> >>> Use llvm::SplitEdge in Transforms/Utils/BasicBlockUtils.h. >>> >>> The technique is to create a new bb with a single branch to bb3, then >>> modify >>> bb1's use of bb3 to point to 'new bb' instead, then fix up any phi nodes >>> in >>> bb3 by replacing uses of bb1 with 'new bb'. >>> >>> Nick >>> >> > >
Hi, I could not figure out, how to declare a Pass*. Can anyone give me an example, how to use SplitEdge() function ? Please help me out. Regards, Chayan On Tue, Jul 20, 2010 at 10:12 AM, Chayan Sarkar <chayan.ju at gmail.com> wrote:> Hi All, > > Still I could not figure out how to use Pass* while calling > SplitEdge() function. Can anyone provide me some example? > > Regards, > Chayan > > On Sun, Jul 18, 2010 at 11:49 PM, Nick Lewycky <nicholas at mxc.ca> wrote: >> Chayan Sarkar wrote: >>> >>> Hi, >>> >>> I have tried to use SplitEdge function, but failed. Actually the third >>> parameter is a variable of type Pass and it need to be non-null. But I >>> could not figure out how to use it. Please help me out. >> >> The only reason it needs a non-NULL Pass* is to call llvm::SplitBlock which >> uses P->getAnalysisIfAvailable unconditionally. Feel free to wrap those >> calls in 'if (P) { ... }' and send us a patch. >> >> Of course, the obvious question is why aren't you doing your transforms >> inside of a Pass? >> >> Nick >> >>> Regards, >>> Chayan >>> >>> On Sat, Jul 17, 2010 at 10:16 PM, Nick Lewycky<nicholas at mxc.ca> wrote: >>>> >>>> Chayan Sarkar wrote: >>>>> >>>>> Hi all, >>>>> >>>>> Suppose in a CFG bb1 has two succesor bb3 and bb4, and bb3 has two >>>>> predecessor bb1 and bb2. Now how can I insert a basic block between >>>>> bb1 and bb3 that at the edge bb1-->bb3 . >>>>> >>>>> In general how can I insert a basic block on an edge? >>>> >>>> Use llvm::SplitEdge in Transforms/Utils/BasicBlockUtils.h. >>>> >>>> The technique is to create a new bb with a single branch to bb3, then >>>> modify >>>> bb1's use of bb3 to point to 'new bb' instead, then fix up any phi nodes >>>> in >>>> bb3 by replacing uses of bb1 with 'new bb'. >>>> >>>> Nick >>>> >>> >> >> >
See http://llvm.org/docs/WritingAnLLVMPass.html If you are inside MyPass::runOn{Module,Function,Loop,BasicBlock}(), just use the "this" pointer. Olivier On Wed, Jul 21, 2010 at 7:35 PM, Chayan Sarkar <chayan.ju at gmail.com> wrote:> Hi, > > I could not figure out, how to declare a Pass*. Can anyone give me an > example, how to use SplitEdge() function ? > > Please help me out. > > Regards, > Chayan > > On Tue, Jul 20, 2010 at 10:12 AM, Chayan Sarkar <chayan.ju at gmail.com> wrote: >> Hi All, >> >> Still I could not figure out how to use Pass* while calling >> SplitEdge() function. Can anyone provide me some example? >> >> Regards, >> Chayan >> >> On Sun, Jul 18, 2010 at 11:49 PM, Nick Lewycky <nicholas at mxc.ca> wrote: >>> Chayan Sarkar wrote: >>>> >>>> Hi, >>>> >>>> I have tried to use SplitEdge function, but failed. Actually the third >>>> parameter is a variable of type Pass and it need to be non-null. But I >>>> could not figure out how to use it. Please help me out. >>> >>> The only reason it needs a non-NULL Pass* is to call llvm::SplitBlock which >>> uses P->getAnalysisIfAvailable unconditionally. Feel free to wrap those >>> calls in 'if (P) { ... }' and send us a patch. >>> >>> Of course, the obvious question is why aren't you doing your transforms >>> inside of a Pass? >>> >>> Nick >>> >>>> Regards, >>>> Chayan >>>> >>>> On Sat, Jul 17, 2010 at 10:16 PM, Nick Lewycky<nicholas at mxc.ca> wrote: >>>>> >>>>> Chayan Sarkar wrote: >>>>>> >>>>>> Hi all, >>>>>> >>>>>> Suppose in a CFG bb1 has two succesor bb3 and bb4, and bb3 has two >>>>>> predecessor bb1 and bb2. Now how can I insert a basic block between >>>>>> bb1 and bb3 that at the edge bb1-->bb3 . >>>>>> >>>>>> In general how can I insert a basic block on an edge? >>>>> >>>>> Use llvm::SplitEdge in Transforms/Utils/BasicBlockUtils.h. >>>>> >>>>> The technique is to create a new bb with a single branch to bb3, then >>>>> modify >>>>> bb1's use of bb3 to point to 'new bb' instead, then fix up any phi nodes >>>>> in >>>>> bb3 by replacing uses of bb1 with 'new bb'. >>>>> >>>>> Nick >>>>> >>>> >>> >>> >> > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >