<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hello LLVMdev,<div class=""><br class=""></div><div class="">I’m using LLVM to do static analysis exclusively (without any code generation). To implement this analysis, I’m using multiple address spaces to disambiguate the purpose of the pointed memory. Since address spaces never alias in my model, I set on to implement an alias analysis pass that would exactly provide this information, as I’m seeing a couple of otherwise dead store that won’t go away. However, I’m struggling to get it to work.</div><div class=""><br class=""></div><div class="">Four years ago, Tobias Grosser <a href="http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20111010/129635.html" class="">implemented such a pass</a>, so I based mine off his. And one year ago, Matthew O’Connor <a href="http://lists.cs.uiuc.edu/pipermail/llvmdev/2014-April/072427.html" class="">ran into a similar issue</a>, and I tried to use the solution that worked for him. The result code is this:</div><div class=""><br class=""></div><div class=""><div style="margin: 0px; font-size: 11px; font-family: Consolas; color: rgb(187, 44, 162);" class=""></div><blockquote type="cite" class=""><div style="margin: 0px; font-size: 11px; font-family: Consolas; color: rgb(187, 44, 162);" class="">namespace</div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class="">{</div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre"> </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">struct</span> AddressSpaceAliasAnalysis : <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">public</span> <span style="font-variant-ligatures: no-common-ligatures; color: #5c2699" class="">FunctionPass</span>, <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">public</span> <span style="font-variant-ligatures: no-common-ligatures; color: #5c2699" class="">AliasAnalysis</span></div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">     </span>{</div><div style="margin: 0px; font-size: 11px; font-family: Consolas; color: rgb(187, 44, 162);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""><span class="Apple-tab-span" style="white-space:pre">           </span></span>static<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> </span>char<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> ID;</span></div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">           </span>AddressSpaceAliasAnalysis() : <span style="font-variant-ligatures: no-common-ligatures; color: #5c2699" class="">FunctionPass</span>(<span style="font-variant-ligatures: no-common-ligatures; color: #4f8187" class="">ID</span>) {</div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">               </span>}</div><p style="margin: 0px; font-size: 11px; font-family: Consolas; min-height: 13px;" class=""><span class="Apple-tab-span" style="white-space:pre">          </span><br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">                </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">virtual</span> <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">bool</span> runOnFunction(<span style="font-variant-ligatures: no-common-ligatures; color: #5c2699" class="">Function</span>& f) <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">override</span></div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">               </span>{</div><div style="margin: 0px; font-size: 11px; font-family: Consolas; color: rgb(61, 29, 129);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""><span class="Apple-tab-span" style="white-space:pre">                    </span></span>InitializeAliasAnalysis<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">(</span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">this</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">, &f.</span>getParent<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">()-></span>getDataLayout<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">());</span></div><div style="margin: 0px; font-size: 11px; font-family: Consolas; color: rgb(187, 44, 162);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""><span class="Apple-tab-span" style="white-space:pre">                       </span></span>return<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> </span>false<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">;</span></div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">             </span>}</div><p style="margin: 0px; font-size: 11px; font-family: Consolas; min-height: 13px;" class=""><span class="Apple-tab-span" style="white-space:pre">          </span><br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">                </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">virtual</span> <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">void</span> getAnalysisUsage(<span style="font-variant-ligatures: no-common-ligatures; color: #5c2699" class="">AnalysisUsage</span> &AU) <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">const</span> <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">override</span></div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">              </span>{</div><div style="margin: 0px; font-size: 11px; font-family: Consolas; color: rgb(61, 29, 129);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""><span class="Apple-tab-span" style="white-space:pre">                    </span></span><span style="font-variant-ligatures: no-common-ligatures; color: #5c2699" class="">AliasAnalysis</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">::</span>getAnalysisUsage<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">(AU);</span></div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">            </span>}</div><p style="margin: 0px; font-size: 11px; font-family: Consolas; min-height: 13px;" class=""><span class="Apple-tab-span" style="white-space:pre">          </span><br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">                </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">virtual</span> <span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">AliasResult</span> alias(<span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">const</span> <span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">Location</span> &LocA, <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">const</span> <span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">Location</span> &LocB) <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">override</span></div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">               </span>{</div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">                  </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">const</span> <span style="font-variant-ligatures: no-common-ligatures; color: #5c2699" class="">Value</span> *V1 = LocA.<span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">Ptr</span>;</div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">                  </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">const</span> <span style="font-variant-ligatures: no-common-ligatures; color: #5c2699" class="">Value</span> *V2 = LocB.<span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">Ptr</span>;</div><p style="margin: 0px; font-size: 11px; font-family: Consolas; min-height: 13px;" class=""><span class="Apple-tab-span" style="white-space:pre">                  </span><br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">                        </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">const</span> <span style="font-variant-ligatures: no-common-ligatures; color: #5c2699" class="">PointerType</span> *PT1 = <span style="font-variant-ligatures: no-common-ligatures; color: #3d1d81" class="">dyn_cast</span><<span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">const</span> <span style="font-variant-ligatures: no-common-ligatures; color: #5c2699" class="">PointerType</span>>(V1-><span style="font-variant-ligatures: no-common-ligatures; color: #3d1d81" class="">getType</span>());</div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">                  </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">const</span> <span style="font-variant-ligatures: no-common-ligatures; color: #5c2699" class="">PointerType</span> *PT2 = <span style="font-variant-ligatures: no-common-ligatures; color: #3d1d81" class="">dyn_cast</span><<span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">const</span> <span style="font-variant-ligatures: no-common-ligatures; color: #5c2699" class="">PointerType</span>>(V2-><span style="font-variant-ligatures: no-common-ligatures; color: #3d1d81" class="">getType</span>());</div><p style="margin: 0px; font-size: 11px; font-family: Consolas; min-height: 13px;" class=""><span class="Apple-tab-span" style="white-space:pre">                  </span><br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Consolas; color: rgb(0, 132, 0);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""><span class="Apple-tab-span" style="white-space:pre">                    </span></span>// The logic here is very simple: pointers to two different address spaces</div><div style="margin: 0px; font-size: 11px; font-family: Consolas; color: rgb(0, 132, 0);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""><span class="Apple-tab-span" style="white-space:pre">                        </span></span>// cannot alias.</div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">                      </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">if</span> (PT1 != <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">nullptr</span> && PT2 != <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">nullptr</span>)</div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">                        </span>{</div><div style="margin: 0px; font-size: 11px; font-family: Consolas; color: rgb(61, 29, 129);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""><span class="Apple-tab-span" style="white-space:pre">                            </span></span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">if</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> (PT1-></span>getAddressSpace<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">() != PT2-></span>getAddressSpace<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">())</span></div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">                           </span>{</div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">                                  </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">return</span> <span style="font-variant-ligatures: no-common-ligatures; color: #3d1d81" class="">NoAlias</span>;</div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">                                </span>}</div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">                  </span>}</div><p style="margin: 0px; font-size: 11px; font-family: Consolas; min-height: 13px;" class=""><span class="Apple-tab-span" style="white-space:pre">                  </span><br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">                        </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">return</span> <span style="font-variant-ligatures: no-common-ligatures; color: #5c2699" class="">AliasAnalysis</span>::<span style="font-variant-ligatures: no-common-ligatures; color: #3d1d81" class="">alias</span>(LocA, LocB);</div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">             </span>}</div><p style="margin: 0px; font-size: 11px; font-family: Consolas; min-height: 13px;" class=""><span class="Apple-tab-span" style="white-space:pre">          </span><br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">                </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">virtual</span> <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">void</span> *getAdjustedAnalysisPointer(<span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">AnalysisID</span> PI) <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">override</span></div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">           </span>{</div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">                  </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">if</span> (PI == &<span style="font-variant-ligatures: no-common-ligatures; color: #5c2699" class="">AliasAnalysis</span>::<span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">ID</span>)</div><div style="margin: 0px; font-size: 11px; font-family: Consolas; color: rgb(92, 38, 153);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""><span class="Apple-tab-span" style="white-space:pre">                              </span></span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">return</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> (</span>AliasAnalysis<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">*)</span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">this</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">;</span></div><div style="margin: 0px; font-size: 11px; font-family: Consolas; color: rgb(187, 44, 162);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""><span class="Apple-tab-span" style="white-space:pre">                 </span></span>return<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> </span>this<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">;</span></div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">              </span>}</div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span class="Apple-tab-span" style="white-space:pre">  </span>};</div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class="">}</div><div style="margin: 0px; font-size: 11px; font-family: Consolas; min-height: 13px;" class=""><br class=""></div><div style="margin: 0px; font-size: 11px; font-family: Consolas; color: rgb(0, 132, 0);" class="">// Register this pass...</div><div style="margin: 0px; font-size: 11px; font-family: Consolas; color: rgb(79, 129, 135);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">char</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> </span>AddressSpaceAliasAnalysis<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">::ID = </span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">0</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">;</span></div><div style="margin: 0px; font-size: 11px; font-family: Consolas; min-height: 13px;" class=""><br class=""></div><div style="margin: 0px; font-size: 11px; font-family: Consolas; color: rgb(196, 27, 23);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">static</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #5c2699" class="">RegisterPass</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""><</span><span style="font-variant-ligatures: no-common-ligatures; color: #4f8187" class="">AddressSpaceAliasAnalysis</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">> aasa(</span>"asaa"<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">, </span>"NoAlias for pointers in different address spaces"<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">, </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">false</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">, </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">true</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">);</span></div><div style="margin: 0px; font-size: 11px; font-family: Consolas; color: rgb(92, 38, 153);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">static</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> </span>RegisterAnalysisGroup<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""><</span>AliasAnalysis<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">> aag(</span><span style="font-variant-ligatures: no-common-ligatures; color: #4f8187" class="">aasa</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">);</span></div><div style="margin: 0px; font-size: 11px; font-family: Consolas; min-height: 13px;" class=""><br class=""></div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #5c2699" class="">FunctionPass</span>* createAddressSpaceAliasAnalysisPass() {</div><div style="margin: 0px; font-size: 11px; font-family: Consolas; color: rgb(79, 129, 135);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""><span class="Apple-tab-span" style="white-space:pre"> </span></span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">return</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">new</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> </span>AddressSpaceAliasAnalysis<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">();</span></div><div style="margin: 0px; font-size: 11px; font-family: Consolas;" class="">}</div></blockquote></div><span id="x-apple-selection:end"></span><div class=""><br class=""></div><div class="">I made it a FunctionPass instead of an ImmutablePass because InitializeAliasAnalysis now needs a DataLayout argument, and I wasn’t sure how to get that one from an ImmutablePass.</div><div class=""><br class=""></div><div class="">The problem: I can add the pass to a `legacy::PassManager` object, and the `runOnFunction` method is called, but `alias` never is, and neither is `getAdjustedAnalysisPointer`.</div><div class=""><br class=""></div><div class="">I use a `PassManagerBuilder` object to populate a `legacy::PassManager`, which I then run on my module. I tried two different approaches to insert my AA pass.</div><div class=""><br class=""></div><div class="">The first was to add the AA pass before calling `populateModulePassManager`, since the AA passes are the first ones to be added, and this would put mine first. This didn’t help: `runOnFunction` was called, but `alias` never was. Additionally, now that I moved from `INITIALIZE_AG_PASS` to `RegisterPass<T>`, trying this causes an assert to trigger with the message "No default implementation found for analysis group!"</div><div class=""><br class=""></div><div class="">The second was to use the `EP_ModuleOptimizerEarly` extension point, since it is called right after the other AA passes are added. This makes my pass the last AA pass to be added. Same result: `runOnFunction` was called, but `alias` never was.</div><div class=""><br class=""></div><div class="">So what am I missing? How can I use my alias analysis pass?</div><div class=""><br class=""></div><div class="">Félix</div><div class=""><br class=""></div></body></html>