<div dir="ltr">On Fri, Aug 9, 2013 at 1:05 PM, Valmico <<a href="mailto:valmico88@gmail.com">valmico88@gmail.com</a>> wrote:<br>> I assume that DA is tool capable to give me an list of Dependencies in code<div>> or at least a easy way to test instructions without much knowledge about ZIV SIV,</div>
<div>> and other tests that has to be done find out dependencies?<div><br></div><div>DA exists to support building a dependence graph.</div><div>It checks to see if two instructions may refer to the same location</div>
<div>in memory, working hard to understand array references.</div><div>Someday the code to build a dependence graph will get written,</div><div>but it doesn't exist yet.</div><div><br></div><div>The weakness with your scheme, besides performance, is that</div>
<div>it may report a dependence between two instructions that are </div><div>never both executed. For example</div><div><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><font face="courier new, monospace">void zap(...) {</font></div>
</div><div><div><font face="courier new, monospace">  if (...)</font></div></div><div><div><font face="courier new, monospace">    A[0] = ...</font></div></div><div><div><span style="font-family:'courier new',monospace">  else</span><br>
</div></div><div><div><font face="courier new, monospace">    A[0] = ...</font></div></div><div><div><span style="font-family:'courier new',monospace">}</span><br></div></div></blockquote><div><div><br></div><div>
your approach will claim there's an output dependence between the two stores to A,</div><div>but in reality, code that executes one will never execute the other, so there</div><div>can be no dependence.</div><div><br>
</div><div>> This is code i came up for now:<br>><br>> virtual bool runOnFunction(Function &F) {<br>><br>>     DependenceAnalysis &DA = this->getAnalysis<DependenceAnalysis>();<br>>    <br>
>     std::vector<Instruction*> instructions;<br>>    <br>>     for( inst_iterator I = inst_begin(F); I != inst_end(F); I++ ) {<br>>         if( isa<StoreInst>( *I ) || isa<LoadInst>( *I ) ) {<br>
>             errs() << "Instruction " << *I << '\n';<br>>            <br>>             for(std::vector<Instruction*>::iterator it = instructions.begin(); it != instructions.end(); it++) {<br>
>                 Dependence *dep = DA.depends(&*I,*it,false);<br>>                 if( dep == NULL ) {<br>>                     //errs() << " no dependence." << '\n';<br>>                 } else if( dep->isConfused() == true ) {<br>
>                     if( dep->isInput() ) {<br>>                         errs() << '\t' << **it << " input dependence." << '\n';<br>>                     } else if( dep->isOutput() ) {<br>
>                         errs() << '\t' << **it << " output dependence." << '\n';<br>>                     } else if( dep->isFlow() ) {<br>>                         errs() << '\t' << **it << " flow dependence." << '\n';<br>
>                     } else if( dep->isAnti() ) {<br>>                         errs() << '\t' << **it << " anti dependence." << '\n';<br>>                     }<br>
>                 } else if( dep->isConfused() == false ) {<br>>                     errs() << "# full dependence." << '\n';<br>>                     //if( FullDependence *FDep = cast<FullDependence>( dep ) ) {<br>
>                     //    errs() << " full dep casted" << '\n';<br>>                     //}<br>>                 }<br>>             }<br>>            <br>>             instructions.push_back(&*I);<br>
>         }<br>>     }<br>> }<br><br></div></div><div>I'm sure an LLVM stud to do a cleaner job, but your code looks plausible.</div><div>I'll note that anything you do for a confused dependence makes sense for a full dependence.</div>
<div>So you can test for input, output, flow, etc.</div><div>If you look at the code in lib/Analysis/DependenceAnalysis.cpp</div><div>you can see how I exercise DA (in dumpExampleDependence)</div><div>and how I print the info associated with a dependence (in Dependence::dump)</div>
<div><br></div><div>Preston</div><div><br></div><div><br></div></div>