DS-AA reports erroneous NoModRef


I am using DataStructureAA.cpp (poolalloc project) for alias analysis purposes and have noticed an error in getModRefInfo(). The situation is that Mod/Ref info is called with a CallSite and GlobalVariable argument, where the global is passed as an argument to the call. Furthermore, the callee function does *nothing* with this global but to pass it on to another callee function. In the last callee, the BottomUp DSNode is the same as the GlobalGraphs' node (very detailed; including a link to another DSNode), but in the top function and the intermediate callee, the global is not accessed and its DSNode is simply "I", without a type.

An error manifests itself in DataStructureAA, as the intermediate function's BottomUp DSNode is used to check for Mod/Ref info (using the RangeIt, then isModifiedNode() and isReadNode()). But the intermediate function's DSNode is simply "I", so no Mod/Ref is reported. This is erroneous; the global is Mod&Ref at the call site.

I am not sure whether there is an error in either ds-aa or in BottomUpDSA.

I have reduced the program down to a simpler test case. Here the intermediate functions have an "IE" node. The error occurs when trying to see if @spec_compress() does Mod/Ref @spec_fd1 (NoModRef reported). In contrast, ds-aa correctly reports ModRef on the callsite to @spec_putc() in @compressStream().

Kind regards,

testcase-dce.ll (6.28 KB)


The correctness of ds-aa hasn't been tested in a long time and hasn't
been tested against changes in BottomUp. ModRef info in general
hasn't been tested for several years, mostly dsa has been used for
it's points-to graph, not the flags.

You might try tracing the inlining with --debug and making sure all
callsites are inlined.