<br><br><div class="gmail_quote">On Thu, Aug 12, 2010 at 5:22 PM, Tobias Grosser <span dir="ltr"><<a href="mailto:grosser@fim.uni-passau.de">grosser@fim.uni-passau.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On 08/12/2010 09:41 PM, Douglas do Couto Teixeira wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Dear guys,<br>
<br>
     I am having problems to obtain good information from the LoopInfo.<br>
I am always getting a trip count of 0, even though I am clearly passing<br>
a loop with a constant bound. I am using this pass below:<br>
</blockquote></div>
Hi,<br>
<br>
I would propose to first check if the trip count is calculated correctly. I would do this with opt by calling:<br>
<br>
opt -mem2reg -loopsimplify -indvars -scalar-evolution -analyze prog.ll<br>
<br>
At the end of the output the tripcount of every loop should be written.<br>
<br>
To get the trip count in your pass you should ask ScalarEvolution.<br>
<br>
ScalarEvolution *SE;<br>
Loop *L;<br>
SE->getBackedgeTakenCount(L);<br>
<br>
If you need help trying this please ask back.<br>
<br>
Cheers<br>
Tobi<br>
</blockquote></div><br><div><div>Thanks Tobias. Your answer helped me a lot.  Now I can get the trip count of the loop like this:</div><div><br></div><div>#define DEBUG_TYPE "hello"</div><div>#include "llvm/Pass.h"</div>
<div>#include "llvm/Function.h"</div><div>#include "llvm/Support/raw_ostream.h"</div><div>#include "llvm/ADT/Statistic.h"</div><div>#include "llvm/Analysis/LoopInfo.h"</div><div>#include "llvm/Analysis/ScalarEvolution.h"</div>
<div><br></div><div>using namespace llvm;</div><div><br></div><div>STATISTIC(HelloCounter, "Counts number of functions greeted");</div><div><br></div><div>namespace {</div><div><br></div><div>struct Hello: public FunctionPass {</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>static char ID; // Pass identification, replacement for typeid</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>Hello() : FunctionPass(&ID) {}</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>void getLoopInfo(const Function& F) const {</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">             </span>const LoopInfo *LI = &getAnalysis<LoopInfo> ();</div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span>ScalarEvolution *SE = &getAnalysis<ScalarEvolution> ();</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>Function::const_iterator BB = F.begin(), E = F.end();</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">             </span>for (; BB != E; ++BB) {</div><div><span class="Apple-tab-span" style="white-space:pre">                      </span>const Loop* L = LI->getLoopFor(&*BB);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                      </span>if (L != NULL) {</div><div><span class="Apple-tab-span" style="white-space:pre">                             </span>errs() << "Trip count: " << *SE->getBackedgeTakenCount(L);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                              </span>L->dump();</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">   </span>virtual bool runOnFunction(Function &F) {</div><div><br></div><div>
<span class="Apple-tab-span" style="white-space:pre">         </span>HelloCounter++;</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>errs() << "Hello: ";</div><div><span class="Apple-tab-span" style="white-space:pre">         </span>errs().write_escaped(F.getName()) << '\n';</div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span>getLoopInfo(F);</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>return false;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>// We don't modify the program, so we preserve all analyses</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>virtual void getAnalysisUsage(AnalysisUsage &AU) const {</div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span>AU.setPreservesAll();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>AU.addRequired<LoopInfo> ();</div><div><span class="Apple-tab-span" style="white-space:pre">           </span>AU.addRequired<ScalarEvolution> ();</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>}</div><div>};</div><div>}</div><div><br></div><div>char Hello::ID = 0;</div><div>static RegisterPass<Hello> Y("hello",</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>"Hello World Pass (with getAnalysisUsage implemented)");</div>
<div><br></div><div><br></div><div>But when I use that same function within a class I get some compiler errors. I'm trying to use this function like this:</div><div><br></div><div><br></div><div>#define DEBUG_TYPE "hello"</div>
<div>#include "llvm/Pass.h"</div><div>#include "llvm/Function.h"</div><div>#include "llvm/Support/raw_ostream.h"</div><div>#include "llvm/ADT/Statistic.h"</div><div>#include "llvm/Analysis/LoopInfo.h"</div>
<div>#include "llvm/Analysis/ScalarEvolution.h"</div><div><br></div><div>using namespace llvm;</div><div><br></div><div>STATISTIC(HelloCounter, "Counts number of functions greeted");</div><div><br></div>
<div>namespace {</div><div><br></div><div>struct Hello: public FunctionPass {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>static char ID; // Pass identification, replacement for typeid</div><div>
<span class="Apple-tab-span" style="white-space:pre"> </span>Hello() : FunctionPass(&ID) {}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">  </span>class testLoopInfo {</div><div><br></div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span>void getLoopInfo(const Function& F) const {</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                     </span>const LoopInfo *LI = &getAnalysis<LoopInfo> ();</div>
<div><span class="Apple-tab-span" style="white-space:pre">                      </span>ScalarEvolution *SE = &getAnalysis<ScalarEvolution> ();</div><div><span class="Apple-tab-span" style="white-space:pre">                    </span>Function::const_iterator BB = F.begin(), E = F.end();</div>
<div><span class="Apple-tab-span" style="white-space:pre">                      </span>for (; BB != E; ++BB) {</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                             </span>const Loop* L = LI->getLoopFor(&*BB);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                              </span>if (L != NULL) {</div><div><span class="Apple-tab-span" style="white-space:pre">                                     </span>errs() << "Trip count: " << *SE->getBackedgeTakenCount(L);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                      </span>L->dump();</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                    </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">   </span>};</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">  </span>virtual bool runOnFunction(Function &F) {</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">             </span>HelloCounter++;</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>errs() << "Hello: ";</div><div><span class="Apple-tab-span" style="white-space:pre">         </span>errs().write_escaped(F.getName()) << '\n';</div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span>//getLoopInfo(F);</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>return false;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>// We don't modify the program, so we preserve all analyses</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>virtual void getAnalysisUsage(AnalysisUsage &AU) const {</div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span>AU.setPreservesAll();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>AU.addRequired<LoopInfo> ();</div><div><span class="Apple-tab-span" style="white-space:pre">           </span>AU.addRequired<ScalarEvolution> ();</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>}</div><div>};</div><div>}</div><div><br></div><div>char Hello::ID = 0;</div><div>static RegisterPass<Hello> Y("hello",</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>"Hello World Pass (with getAnalysisUsage implemented)");</div>
<div><br></div><div>I get the following errors:</div><div><br></div><div>**** Build of configuration Debug for project HelloLLVM ****</div><div><br></div><div>make all </div><div>llvm[0]: Compiling Hello.cpp for Release build (PIC)</div>
<div>Hello.cpp: In member function ‘void<unnamed>::Hello::testLoopInfo::getLoopInfo(const llvm::Function&) const’:</div><div>Hello.cpp:37: error: no matching function for call to ‘llvm::Pass::getAnalysis()’</div>
<div>/home/douglas/Programas/llvm-2.7/include/llvm/PassAnalysisSupport.h:209: note: candidates are: AnalysisType& llvm::Pass::getAnalysis() const [with AnalysisType = llvm::LoopInfo] <near match></div><div>Hello.cpp:38: error: no matching function for call to ‘llvm::Pass::getAnalysis()’</div>
<div>/home/douglas/Programas/llvm-2.7/include/llvm/PassAnalysisSupport.h:209: note: candidates are: AnalysisType& llvm::Pass::getAnalysis() const [with AnalysisType = llvm::ScalarEvolution] <near match></div><div>
Hello.cpp: In member function ‘virtual bool<unnamed>::Hello::runOnFunction(llvm::Function&)’:</div><div>Hello.cpp:57: error: ‘getLoopInfo’ was not declared in this scope</div><div>make: ** [/home/douglas/Programas/llvm-2.7/lib/Transforms/Hello/Release/Hello.o] Erro 1</div>
<div><br></div><div><br></div><div>Anyone know how can I fix it?</div><div><br></div><div><br></div><div>Thanks a lot,</div><div><br></div><div>Douglas</div><div><br></div></div><div><br></div>