Michael Ilseman
2011-Jun-01 18:19 UTC
[LLVMdev] How best to time passes using the API instead of opt? Also, memory leaks when trying to do timing in the API.
Thanks for the reply! Unfortunately, that seems to have the same effect as setting llvm::TimePassesIsEnabled myself, and all my same problems still apply as the TimingInfo's destructor (PassManager.cpp) is still never called. Running it in the debugger shows that TimerGroup's removeTimer method is never called, nor is it's destructor (but it's constructor is). On Wed, Jun 1, 2011 at 11:51 AM, Andrew Clinton <andrew at sidefx.com> wrote:> I got it working with this: > > int argc = 2; > const char *argv[2] = {"myopt", "-time-passes"}; > > cl::ParseCommandLineOptions(argc, (char **)argv, "my optimizer"); > > On 06/01/2011 01:19 PM, Michael Ilseman wrote: >> I have some PassManagers, and I would like to output timing data for >> how long each pass takes to execute with a separate application using >> the API, rather than through an llvm tool. Unfortunately, I'm having >> trouble seeing how to use the existing facilities without using opt. >> Setting llvm::TimePassesIsEnabled before creating the PassManagers >> doesn't seem to output anything, though it is making Timers and >> TimerGroups. Even if I call llvm::getPassTimer for one of the passes >> (and I do get a timer that is initialized), I can't figure out to get >> to its TimerGroup (TG is private, but if I use a debugger, I can get >> it and call printAll successfully). Looking through the code, >> TimerGroup's removeTimer (also called in it's destructor) appears to >> print everything out to the info-output-file (stderr) when its Timers >> are all removed but I see no output, however I'm able to call >> llvm::CreateInfoOutputFile myself, pipe to it, and stuff shows up on >> stderr. In PassManager.cpp, TheTimeInfo (which is a TimingInfo), gets >> assigned once, and as far as I can tell never gets deleted, thus its >> destructor is never called, the Timers are never deleted, and the >> timing data is never output. Valgrind shows these Timers, TimerGroup, >> and TimingInfo as being memory leaks for my application when I enable >> llvm::TimePassesIsEnabled. Is there a way in the API to delete >> TheTimeInfo myself, even though TheTimeInfo is static? Also, if this >> is a bug/deficiency, I'm willing to patch this with some guidance, >> e.g. is putting "delete TheTimingInfo; TheTimeInfo = 0"; in >> PMTopLevelManager's destructor appropriate? Or is there a much easier >> solution that I'm just missing? >> >> Thanks. >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >
Andrew Clinton
2011-Jun-01 18:24 UTC
[LLVMdev] How best to time passes using the API instead of opt? Also, memory leaks when trying to do timing in the API.
Oh, you probably also need to create a static llvm_shutdown_obj. On 06/01/2011 02:19 PM, Michael Ilseman wrote:> Thanks for the reply! Unfortunately, that seems to have the same > effect as setting llvm::TimePassesIsEnabled myself, and all my same > problems still apply as the TimingInfo's destructor (PassManager.cpp) > is still never called. Running it in the debugger shows that > TimerGroup's removeTimer method is never called, nor is it's > destructor (but it's constructor is). > > On Wed, Jun 1, 2011 at 11:51 AM, Andrew Clinton<andrew at sidefx.com> wrote: >> I got it working with this: >> >> int argc = 2; >> const char *argv[2] = {"myopt", "-time-passes"}; >> >> cl::ParseCommandLineOptions(argc, (char **)argv, "my optimizer"); >> >> On 06/01/2011 01:19 PM, Michael Ilseman wrote: >>> I have some PassManagers, and I would like to output timing data for >>> how long each pass takes to execute with a separate application using >>> the API, rather than through an llvm tool. Unfortunately, I'm having >>> trouble seeing how to use the existing facilities without using opt. >>> Setting llvm::TimePassesIsEnabled before creating the PassManagers >>> doesn't seem to output anything, though it is making Timers and >>> TimerGroups. Even if I call llvm::getPassTimer for one of the passes >>> (and I do get a timer that is initialized), I can't figure out to get >>> to its TimerGroup (TG is private, but if I use a debugger, I can get >>> it and call printAll successfully). Looking through the code, >>> TimerGroup's removeTimer (also called in it's destructor) appears to >>> print everything out to the info-output-file (stderr) when its Timers >>> are all removed but I see no output, however I'm able to call >>> llvm::CreateInfoOutputFile myself, pipe to it, and stuff shows up on >>> stderr. In PassManager.cpp, TheTimeInfo (which is a TimingInfo), gets >>> assigned once, and as far as I can tell never gets deleted, thus its >>> destructor is never called, the Timers are never deleted, and the >>> timing data is never output. Valgrind shows these Timers, TimerGroup, >>> and TimingInfo as being memory leaks for my application when I enable >>> llvm::TimePassesIsEnabled. Is there a way in the API to delete >>> TheTimeInfo myself, even though TheTimeInfo is static? Also, if this >>> is a bug/deficiency, I'm willing to patch this with some guidance, >>> e.g. is putting "delete TheTimingInfo; TheTimeInfo = 0"; in >>> PMTopLevelManager's destructor appropriate? Or is there a much easier >>> solution that I'm just missing? >>> >>> Thanks. >>> _______________________________________________ >>> LLVM Developers mailing list >>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >>
Michael Ilseman
2011-Jun-01 22:35 UTC
[LLVMdev] How best to time passes using the API instead of opt? Also, memory leaks when trying to do timing in the API.
Yes, thank you, that's basically what I have missing. I had seen ManagedStatic crop up a few times but hadn't explored it. It seems there are a lot of hidden gems in llvm/Support like this. On Wed, Jun 1, 2011 at 12:24 PM, Andrew Clinton <andrew at sidefx.com> wrote:> Oh, you probably also need to create a static llvm_shutdown_obj. > > On 06/01/2011 02:19 PM, Michael Ilseman wrote: >> Thanks for the reply! Unfortunately, that seems to have the same >> effect as setting llvm::TimePassesIsEnabled myself, and all my same >> problems still apply as the TimingInfo's destructor (PassManager.cpp) >> is still never called. Running it in the debugger shows that >> TimerGroup's removeTimer method is never called, nor is it's >> destructor (but it's constructor is). >> >> On Wed, Jun 1, 2011 at 11:51 AM, Andrew Clinton<andrew at sidefx.com> wrote: >>> I got it working with this: >>> >>> int argc = 2; >>> const char *argv[2] = {"myopt", "-time-passes"}; >>> >>> cl::ParseCommandLineOptions(argc, (char **)argv, "my optimizer"); >>> >>> On 06/01/2011 01:19 PM, Michael Ilseman wrote: >>>> I have some PassManagers, and I would like to output timing data for >>>> how long each pass takes to execute with a separate application using >>>> the API, rather than through an llvm tool. Unfortunately, I'm having >>>> trouble seeing how to use the existing facilities without using opt. >>>> Setting llvm::TimePassesIsEnabled before creating the PassManagers >>>> doesn't seem to output anything, though it is making Timers and >>>> TimerGroups. Even if I call llvm::getPassTimer for one of the passes >>>> (and I do get a timer that is initialized), I can't figure out to get >>>> to its TimerGroup (TG is private, but if I use a debugger, I can get >>>> it and call printAll successfully). Looking through the code, >>>> TimerGroup's removeTimer (also called in it's destructor) appears to >>>> print everything out to the info-output-file (stderr) when its Timers >>>> are all removed but I see no output, however I'm able to call >>>> llvm::CreateInfoOutputFile myself, pipe to it, and stuff shows up on >>>> stderr. In PassManager.cpp, TheTimeInfo (which is a TimingInfo), gets >>>> assigned once, and as far as I can tell never gets deleted, thus its >>>> destructor is never called, the Timers are never deleted, and the >>>> timing data is never output. Valgrind shows these Timers, TimerGroup, >>>> and TimingInfo as being memory leaks for my application when I enable >>>> llvm::TimePassesIsEnabled. Is there a way in the API to delete >>>> TheTimeInfo myself, even though TheTimeInfo is static? Also, if this >>>> is a bug/deficiency, I'm willing to patch this with some guidance, >>>> e.g. is putting "delete TheTimingInfo; TheTimeInfo = 0"; in >>>> PMTopLevelManager's destructor appropriate? Or is there a much easier >>>> solution that I'm just missing? >>>> >>>> Thanks. >>>> _______________________________________________ >>>> LLVM Developers mailing list >>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >>> _______________________________________________ >>> LLVM Developers mailing list >>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >>> > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >
Seemingly Similar Threads
- [LLVMdev] How best to time passes using the API instead of opt? Also, memory leaks when trying to do timing in the API.
- [LLVMdev] How best to time passes using the API instead of opt? Also, memory leaks when trying to do timing in the API.
- [LLVMdev] How best to time passes using the API instead of opt? Also, memory leaks when trying to do timing in the API.
- [LLVMdev] generating pass timing info in a JIT context
- [LLVMdev] [PATCH] Add new phase to legalization to handle vector operations