Hi Xiaozhu & Jim, What we are looking for here doesn’t really have a specific theoretical meaning. But think of it from a user interface perspective. If you were a user sitting in front a performance tool that showed you a list of the top 10 loops taking the largest amount of time, how would you want it to identify those loops in a “short” manner? And if you double-clicked on a particular loop in the list, and the tool popped up a source code editor, where would you want it to focus?
For, say: 205: for (int i = 0; i < 100; ++i) 206: { 207: std::cout << i << std::endl; 208: } the answer is probably line #205. For: 305: int i = 0; 306: do 307: { 308: std::cout << i << std::endl; 309: ++i; 310: } while (i < 100); I suppose I would say line #306. Although line #310 could be a reasonable answer too. But I don’t know that it needs to be the last source statement of the loop. — Bill > On Jul 31, 2015, at 2:30 PM, Xiaozhu Meng <xm...@cs.wisc.edu> wrote: > > Hi Bill, > > I am not clear about the concept of the "defining statement of the > loop". If the "defining statement of the loop" refers to the statement > in the loop that has the minimum source line number, then I think your > alternative way can work. But if the "defining statement of the loop" > refers to the statement that contains the loop condition, then your > alternative way would not work because the loop condition can be last > source statement of the loop. Could you provide more details on what > you mean by the defining statement of the loop? > > Thanks > > --Xiaozhu > > On Thu, Jul 30, 2015 at 9:28 PM, William Hachfeld <w...@krellinst.org> wrote: >> >> Hi Jim, >> >> To get a better understanding of what Xiaozhu is writing about, take a look >> at the diagrams on the right side of: >> >> https://en.wikipedia.org/wiki/Control_flow_graph >> >> Figure (d) shows an irreducible CFG. In particular, Xiaozhu is indicating >> that the new API is designed to allow for the representation of the two >> middle nodes in (d). These two nodes represent a loop which has 2 different >> entry points. I.e. multiple “head”. >> >> Unfortunately because the old Dyninst API didn’t handle this case, the >> Open|SpeedShop database schema I designed doesn’t either. :-( It also >> doesn’t necessarily matter. The only place that the “addr_head” value is >> used is in order to identify which source statement is the “definition” of >> the loop. >> >> Is there some, alternate, way of identifying which basic block is contained >> within the defining statement of the loop, Xiaozhu? I don’t have the Dyninst >> 9 API available to me right now… Otherwise we need some alternate mechanism >> of picking the “head” address, Jim. >> >> One possibility - just off the cuff mind you - might be to call >> getLoopEntries() to get the basic block of each entry. Then, for each of >> these, take the first address of that basic block and query the source >> file/line containing that address. Assuming that all line numbers are within >> a single source file, the minimum line number is probably reasonably the >> loop definition. And the first address in that basic block would be the one >> to use for “addr_head” in the Open|SS database. >> >> — Bill >> >> >> >> On Jul 28, 2015, at 11:08 AM, Xiaozhu Meng <xm...@cs.wisc.edu> wrote: >> >> It is more complicated than that. For a natural loop, it only has one >> entry, which is also called the head because the entry dominates all >> blocks of the loop. However, for an irreducible loop, it can have >> multiple entries and it is possible that none of the entries dominates >> the other blocks in the loop. >> >> Thanks >> >> --Xiaozhu >> >> On Tue, Jul 28, 2015 at 10:58 AM, Jim Galarowicz <j...@krellinst.org> wrote: >> >> Hi Xiaozhu, >> >> Is the first entry in the vector e the loop head? >> >> >> BPatch_Vector<BPatch_basicBlock*> entries; >> loop->getLoopEntries(entries); >> BPatch_basicBlock* head entries[0]; >> >> if (head == NULL) >> { >> continue; >> } >> >> LoopInfo info(Address(head->getStartAddress()) - >> module_base); >> >> BPatch_Vector<BPatch_basicBlock*> blocks; >> loop->getLoopBasicBlocks(blocks); >> >> for (unsigned int i 0; i < blocks.size(); ++i) >> { >> BPatch_basicBlock* block blocks[i]; >> >> >> Or is it more complicated than that? >> >> Thanks, >> Jim G >> >> >> Thanks, >> Jim G >> On 07/28/2015 10:37 AM, Xiaozhu Meng wrote: >> >> >> Hi Jim, >> >> The old getLoopHead() method has been replaced by the following new >> interface to appropriately represent irreducible loops: >> >> int >> BPatch_basicBlockLoop::getLoopEntries(BPatch_Vector<BPatch_basicBlock*> &e); >> >> The new interface returns the number of entry blocks of this loop and >> the entries blocks are returned as the output parameter. >> >> On Tue, Jul 28, 2015 at 8:42 AM, Jim Galarowicz <j...@krellinst.org> wrote: >> >> >> Hi all, >> >> I've downloaded the git source version of dyninst and built it on NASA's >> pfe >> machine and my laptop in an attempt to run it on Intel MIC binaries. The >> 8.2.1 asserts in switches related to the architecture type. >> >> However, I ran into a compile error with our loop code: >> >> [ 16%] Building CXX object >> >> libopenss-framework/CMakeFiles/openss-framework-symtabapi.dir/DyninstSymbols.cxx.o >> cd /u/jgalarow/OpenSpeedShop/build_mic_offline_fe/libopenss-framework && >> /nasa/pkgsrc/2014Q3/gcc49/bin/g++ -DHAVE_DYNINST -DHAVE_STDINT_H=1 >> -DHAVE_SYS_STAT_H=1 -DOPENSS_USE_SYMTABAPI=1 >> >> -DOpenSpeedShop_LIBRARY_FILE_DIR=\"/nobackupp8/jgalarow/maia/pfe_ossoffline/lib64\" >> -DPACKAGE=1 -DPACKAGE_VERSION=1 -DVERSION=\"2.1\" -D_GNU_SOURCE >> -Dopenss_framework_symtabapi_EXPORTS -g -fPIC >> -I/u/jgalarow/OpenSpeedShop/libopenss-framework >> -I/u/jgalarow/OpenSpeedShop/build_mic_offline_fe/libopenss-framework >> >> -I/u/jgalarow/OpenSpeedShop/build_mic_offline_fe/libopenss-framework/offline >> -I/nasa/boost/1.50.0/include >> -I/nobackup/jgalarow/dyninst-9.0.0/include/dyninst >> -I/nobackup/jgalarow/dyninst-9.0.0/include >> -I/u/jgalarow/krellroot_v2.1u8/include >> >> -I/u/jgalarow/OpenSpeedShop/build_mic_offline_fe/libopenss-framework/../libopenss-framework >> -o CMakeFiles/openss-framework-symtabapi.dir/DyninstSymbols.cxx.o -c >> /u/jgalarow/OpenSpeedShop/libopenss-framework/DyninstSymbols.cxx >> /u/jgalarow/OpenSpeedShop/libopenss-framework/DyninstSymbols.cxx: In >> function 'std::vector<LoopInfo> getLoopsAt(const >> OpenSpeedShop::Framework::Address&, BPatch_image&)': >> /u/jgalarow/OpenSpeedShop/libopenss-framework/DyninstSymbols.cxx:140:49: >> error: 'class BPatch_basicBlockLoop' has no member named 'getLoopHead' >> BPatch_basicBlock* head loop->getLoopHead(); >> ^ >> make[2]: *** >> >> [libopenss-framework/CMakeFiles/openss-framework-symtabapi.dir/DyninstSymbols.cxx.o] >> Error 1 >> make[2]: Leaving directory >> `/home4/jgalarow/OpenSpeedShop/build_mic_offline_fe' >> make[1]: *** >> [libopenss-framework/CMakeFiles/openss-framework-symtabapi.dir/all] Error >> 2 >> make[1]: Leaving directory >> `/home4/jgalarow/OpenSpeedShop/build_mic_offline_fe' >> >> I found this in my emails about dyninst: >> >> Hi, >> >> We are planing to improve our current loop detection algorithm to be able >> to >> handle irreducible loops. Such loops can have multiple entry blocks. For >> this matter, the original interface to get the loop head needs to be >> changed >> to return a vector of heads of a loop. >> >> The involved interface is: >> >> BPatch_basicBlock* BPatch_basicBlockLoop::getLoopHead(); >> >> We plan to change it to: >> >> bool BPatch_basicBlockLoop::getLoopHead(std::vector<BPatch_basicBlock*>& >> entries); >> >> Let us know if you are using the interface and if the interface change >> will >> cause significant inconvenience to you. >> >> Thanks >> >> --Xiaozhu >> >> >> However, I can't find any examples of the new getLoopHead code in the >> latest >> Dyninst source. Can someone point me to it? >> >> >> pfe21-101>pwd >> /nobackupp8/jgalarow/OpenSpeedShop_ROOT/BUILD/pfe20/dyninst-9.0.0 >> >> pfe21-94>grep basicBlockLoop::getLoopHead * >> pfe21-95>!!/* >> grep basicBlockLoop::getLoopHead */* >> pfe21-96>!!/* >> grep basicBlockLoop::getLoopHead */*/* >> pfe21-97>!!/* >> grep basicBlockLoop::getLoopHead */*/*/* >> pfe21-98>!!/* >> grep basicBlockLoop::getLoopHead */*/*/*/* >> pfe21-99>!!/* >> grep basicBlockLoop::getLoopHead */*/*/*/*/* >> pfe21-100>!!/* >> grep basicBlockLoop::getLoopHead */*/*/*/*/*/* >> pfe21-101>pwd >> /nobackupp8/jgalarow/OpenSpeedShop_ROOT/BUILD/pfe20/dyninst-9.0.0 >> >> pfe21-104>grep getLoopHead * >> pfe21-105>!!/* >> grep getLoopHead */* >> pfe21-106>!!/* >> grep getLoopHead */*/* >> !!/* >> >> LOOKS LIKE THE OLD INTERFACE: >> >> dyninstAPI/src/hybridOverwrites.C:// >> (*lIter)->getLoopHead()->getStartAddress(), >> dyninstAPI/src/hybridOverwrites.C:// >> writeLoop->getLoopHead()->getStartAddress(), >> pfe21-107>!!/* >> grep getLoopHead */*/*/* >> pfe21-108>!!/* >> grep getLoopHead */*/*/*/* >> pfe21-109>!!/* >> grep getLoopHead */*/*/*/*/* >> pfe21-110> >> >> >> I need to change this to work with the new API: >> cat -n /u/jgalarow/OpenSpeedShop/libopenss-framework/DyninstSymbols.cxx >> ... >> ... >> >> 122 BPatch_Vector<BPatch_basicBlockLoop*> loops; >> 123 cfg->getLoops(loops); >> 124 >> 125 for (unsigned int l 0; l < loops.size(); ++l) >> 126 { >> 127 BPatch_basicBlockLoop* loop loops[l]; >> 128 >> 129 if ((loop == NULL) || >> !loop->containsAddressInclusive( >> 130 (module_base + address).getValue() >> 131 )) >> 132 { >> 133 continue; >> 134 } >> 135 >> 136 // A loop containing this address has been >> found! >> Rejoice! >> 137 // And, of course, obtain the loop's head >> address >> and basic >> 138 // block address ranges... >> 139 >> 140 BPatch_basicBlock* head loop->getLoopHead(); >> 141 >> 142 if (head == NULL) >> 143 { >> 144 continue; >> 145 } >> 146 >> 147 LoopInfo info(Address(head->getStartAddress()) >> - >> module_base); >> 148 >> 149 BPatch_Vector<BPatch_basicBlock*> blocks; >> 150 loop->getLoopBasicBlocks(blocks); >> 151 >> 152 for (unsigned int i 0; i < blocks.size(); >> ++i) >> 153 { >> ... >> ... >> >> >> Thanks, >> Jim G >> >> >> On 09/23/2014 04:57 PM, Xiaozhu Meng wrote: >> >> Hi, >> >> We are planing to improve our current loop detection algorithm to be able >> to >> handle irreducible loops. Such loops can have multiple entry blocks. For >> this matter, the original interface to get the loop head needs to be >> changed >> to return a vector of heads of a loop. >> >> The involved interface is: >> >> BPatch_basicBlock* BPatch_basicBlockLoop::getLoopHead(); >> >> We plan to change it to: >> >> bool BPatch_basicBlockLoop::getLoopHead(std::vector<BPatch_basicBlock*>& >> entries); >> >> Let us know if you are using the interface and if the interface change >> will >> cause significant inconvenience to you. >> >> Thanks >> >> --Xiaozhu >> >> >> _______________________________________________ >> Dyninst-api mailing list >> Dyninst-api@cs.wisc.edu >> https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api >> >> >> >>
_______________________________________________ Dyninst-api mailing list Dyninst-api@cs.wisc.edu https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api