<div dir="ltr"><div>Dear LLVM developers,</div><div><br></div><div>I am Shen, a PhD student at Lehigh Univ. PA.  Now I am implementing a Program Dependence Graph(PDG) on LLVM. I have 4 passes here:</div><div><br></div><div>1. ProgramDependenceGraph (a <b>ModulePass </b>on the highest level)</div><div>2. DataDependenceGraph (a Intermediate <b>FunctionPass</b>).</div><div>3. FlowDependenceAnalysis Pass (a intermediate <b>FunctionPass</b>) which uses llvm built-in AliasAnalysis (-basicaa)</div><div>4. AliasAnalysis Pass  (LLVM built-in Pass)</div><div><br></div><div>When my call chain is </div><div><br></div><div>DatadependenceGraph <-- FlowDependenceAnalysis <-- AliasAnalysis <br></div><div><br></div><div>everything is fine and basicaa is executed successfully.</div><div><br></div><div>My problem is, <b>when I use a Module Pass to call a Function Pass, the low level AliasAnalysis does not work anymore</b>, all return values for location comparisons are "May Alias". In other words, the call chain</div><div><br></div><div>ProgramDependenceGraph(Module Pass) <-- DatadependenceGraph(<b>Function Pass</b>) <-- FlowDependenceAnalysis <-- AliasAnalysis if failed.<br></div><div><br></div><div>However, if <b>I change ProgramDependenceGraph into a Function Pass, this call chain works and AliasAnalysis can be executed successfully.</b></div><div><br></div><div>So, i guess there may be an error in my interaction between Module Pass and Function Pass. Could you give me some hints to help me solve it? Thank you very much!</div><div><br></div><div><br></div><div>Here are some key code for Pass interaction in my implementation: </div><div><br></div><div><div>bool ProgramDependencyGraph::<b>runOnModule</b>(Module &M)</div><div>{</div><div> ...</div><div>  for(Module::iterator F = M.begin(), E = M.end(); F != E; ++F)</div><div>    {</div><div>       DataDependencyGraph &ddgGraph = getAnalysis<DataDependencyGraph>(*F);<br></div><div>       ....</div><div>    }</div></div><div>}</div><div><br></div><div>...</div><div><div>void ProgramDependencyGraph::getAnalysisUsage(AnalysisUsage &AU) const</div><div>{</div><div>   ...</div><div>  AU.addRequired<DataDependencyGraph>();<br></div><div>  AU.setPreservesAll();<br></div><div>}</div></div><div><br></div><div><br></div><div>Best Regards,</div><div><br></div><div>Shen</div><div><br></div><div><br></div></div>