<div dir="auto">Thanks, I'll check it out. </div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">2020년 10월 23일 (금) 오후 5:49, Florian Hahn <<a href="mailto:florian_hahn@apple.com">florian_hahn@apple.com</a>>님이 작성:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space">Hi,<br><div><br><blockquote type="cite"><div>On Oct 23, 2020, at 09:23, ZIN MOON via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank" rel="noreferrer">llvm-dev@lists.llvm.org</a>> wrote:</div><br><div><div dir="ltr"><div>Dear All</div><div><br></div><span lang="en"><span title="">I have a question about the getInductionVariable API.</span><br><span title="">I was trying to get an induction variable (indvar) in the code below using the getInductionVariable API (LoopInfo class).</span></span><div></div><div><br></div><div><b>C file</b><br></div><div>void test(int val) {</div><div>  int sum = 0, i = 0;<br></div><div>  for (i = 0; i < val; i++) {</div><div>      sum += i;<br></div><div>  }<br></div><div>}</div><div><br></div><div><b>IR (with mem2reg pass)</b><br></div><div>; Function Attrs: nounwind<br>define dso_local void @test(i32 %0) #0 {<br>  br label %2<br>2:                                                ; preds = %6, %1<br>  %.01 = phi i32 [ 0, %1 ], [ %5, %6 ]<br>  %.0 = phi i32 [ 0, %1 ], [ %7, %6 ]<br>  %3 = icmp slt i32 %.0, %0<br>  br i1 %3, label %4, label %8 <- <span style="color:rgb(204,204,204)"><span style="background-color:rgb(0,0,255)"><b>Why don't check this BranchInst ?</b></span></span><br>4:                                                ; preds = %2<br>  %5 = add nsw i32 %.01, %.0<br>  br label %6<br>6:                                                ; preds = %4<br>  %7 = add nsw i32 %.0, 1<br> <b> br label %2  <- <span style="background-color:rgb(255,0,0)">checked it whether isCondition by getLatchCmpInst API(called by getInductionVariable API)</span></b><br>8:                                                ; preds = %2<br>  ret void<br>}</div><div><br></div><div></div>Then I got null (no indvar) because BranchInst's number of operands was less than 2.(red block).<br><br>A CmpInst(compare with induction variable) is contained in the header of the loop.<br>But the getInductionVariable API checks only in a latch block(contains a branch back to the header of the loop)<br>is there a missing case that contains CmpInst in the header?<br><br>And if I use the getCanonicalInductionVariable API, I can get the variable 'i'(%. 01) as an indvar.<br><br>I checked the code implementing getInductionVariable and getCanonicalInductionVariable.<br>It seems that indvar and canonical indvar differ only in the starting number (0 or none).<br>Why not use the same way to detect the indvar between getInductionVariable and getCanonicalInductionVariable.<br></div></div></blockquote></div><br><div><br></div><div>Most loop transformations and utilities expect to work on ‘rotated’ loops (<a href="https://www.llvm.org/docs/LoopTerminology.html#rotated-loops" target="_blank" rel="noreferrer">https://www.llvm.org/docs/LoopTerminology.html#rotated-loops</a>). It is probably best to also run `-loop-rotate` before transforming analyzing/transforming the loop.</div><div><br></div><div>Note that the documentation for getInductionVariable explicitly requires the induction variable to determine the condition of the branch in the loop latch (<a href="http://llvm.org/doxygen/classllvm_1_1Loop.html#ab05e97728516fbeeaa9426496257c800" target="_blank" rel="noreferrer">http://llvm.org/doxygen/classllvm_1_1Loop.html#ab05e97728516fbeeaa9426496257c800</a>) and uses InductionDescriptor::isInductionPHI to detect induction PHIs (plus some other checks). There’s also isAuxiliaryInductionVariable, which does not have the latch branch requirement or you can use InductionDescriptor directly.</div><div><br></div><div>Cheers,</div><div>Florian</div></div></blockquote></div>