<div class="gmail_extra"><div class="gmail_quote"><div>Hi,</div><div><br></div><div>The DependenceAnalysis pass will find loop-carried dependences. However, it is a conservative analysis and will sometimes suggest there may be more dependences than actually exist. In your example, I expect the analysis is confused for some reason and is returning the default confused response. You could test it using the isConfused() method. Note that the DVEntry::ALL direction is always valid. A distance of NULL is similarly valid; it merely indicates that the analysis couldn't figure out a fixed distance (or perhaps one doesn't exit).</div>
<div><br></div><div>In your example, there's certainly a dependence from the load to the store. I'd expect it to report a consistent, loop-carried anti dependence with distance -1, and it does for me. Here's the test program I used:</div>
<div><br></div></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><div><div><font face="courier new, monospace">void zip(double *arr) {</font></div>
</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div><div><font face="courier new, monospace">  for (int i = 1; i < 100; i++) {</font></div></div></div></div><div class="gmail_extra"><div class="gmail_quote">
<div><div><font face="courier new, monospace">    arr[i] = arr[i-1];</font></div></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div><div><font face="courier new, monospace">  }</font></div></div></div>
</div><div class="gmail_extra"><div class="gmail_quote"><div><div><font face="courier new, monospace">}</font></div></div></div></div></blockquote><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>and here's how I compiled things:</div>
<div><br></div></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><div><div><font face="arial, helvetica, sans-serif">clang -c -emit-llvm zip.c -o zip.bc</font></div>
</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div><div><font face="arial, helvetica, sans-serif">opt -basicaa -mem2reg -simplifycfg -loop-simplify -loop-rotate -simplifycfg -instcombine -indvars -da -analyze zip.bc</font></div>
</div></div></div></blockquote><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>Some of the passes may not be necessary, but they're what I use by default. In this case, -analyze tests 3 pairs of memory references, the load against itself, the load versus the store, and the store against itself. It reports:</div>
<div><br></div></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><div><div>da analyze - consistent input [0|<]!</div></div></div></div><div class="gmail_extra">
<div class="gmail_quote"><div><div>da analyze - consistent anti [-1]!</div></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div><div>da analyze - consistent output [0|<]!</div></div></div></div></blockquote>
<div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>Hope this helps,</div><div>Preston</div><div><br></div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Hello everyone,<br><br>I intend to build a pass to profile some benchmarks for loop carried dependencies.  At first I tried looking at LoopDependenceAnalysis.{h,cpp} but the files were removed for some reason.  So I continued with the DependenceAnalysis pass.  But the flow, anti dependence, etc methods are only reporting sequential and not loop carried dependencies.  Does LLVM support loop carried dependency analysis?<br>

<br>In addition, the distance and direction for dependent instructions always have invalid values; Dependence::getDirection() returns DVEntry::ALL which is the default value and Dependence::getDistance always returns null.  <br>

<br>E.g, for this input loop:<br>for (int i = 1; i < 100; i++)<br>{<br>    arr[i] = arr[i-1];<br>}<br><br>This dependence is reported:<br>%1 = load i32* %arrayidx.i, align 4  --->   store i32 %1, i32* %arrayidx2.i, align 4<br>

<br>And the following is the code to output distance and directions.  nestingLevel is the innermost loop depth, 1 in this case.<br><br>Dependence* dependence = dependenceAnalysis->depends(instructions[src], instructions[dst], true);<br>

if (dependence)<br>{<br>    unsigned direction = dependence->getDirection(nestingLevel); // Returns DVEntry::ALL<br>    if (const SCEV* scev = dependence->getDistance(nestingLevel))  // Returns null<br>    {...}<br>

}<br><br></blockquote></div></div>