Objects of MemoryLocation class are created for ‘llvm.memset.*‘ intrinsics

Dear llvm contributors,

Could you please advise me where objects of MemoryLocation class are
created for ‘llvm.memset.*‘ intrinsics?

In the Bug 23077 (https://llvm.org/bugs/show_bug.cgi?id=23077) the
AliasSetTracker constructs 128 alias sets for 0 pointer values, which
contain only unknown instructions. In this case, all unknown
instructions, which are added to new alias sets in the
AliasSetTracker::addUnknown, have the following form:

call void @llvm.memset.p0i8.i64(i8* %scevgep..., i8 0, i64 256, i32 8, i1 false)

Furthermore, in this case, there aren’t any unknown instructions,
which are added by AliasSetTracker::addUnknown to alias sets that are
found by findAliasSetForUnknownInst. That’s why I would like to check
objects of MemoryLocation class that are created for ‘llvm.memset.*‘
intrinsics. If I’m not mistaken, objects of MemoryLocation class are
involved in alias analysis and, in particular, in work of
findAliasSetForUnknownInst.

Thank you for the attention!

Hi Roman,

The MemoryLocation objects are involved in findAliasSetForUnknownInst, but none are created there for the memset intrinsic. MemoryLocation objects are only involved for the regular memory accesses being compared to the unknown instruction. See AliasSet::aliasesUnknownInst in lib/Analysis/AliasSetTracker.cpp.

We do know how to create MemoryLocation objects for memsets, see MemoryLocation::getForDest, but we don't do so in the AliasSetTracker. We're taking advantage here of the fast that AA's getModRefInfo understands (or should understand) enough about memset to accurately answer the queries.

-Hal

Hi Hal,

Thank you for the explanation!

Hi Hal,

I'm sorry for disturbing you. Could you please advise me how to skip
checks, which are performed in AliasSet::aliasesUnknownInst, of
unknown instructions from different alias sets of an alias set tracker
that is a parameter of ‘AliasSetTracker::add(const AliasSetTracker
&AST)’?

If this wasn’t available at the moment and you could review me, I
would try to implement it. A temporary patch can be found attached. It
passes the LLVM regression tests and helps to reduce the runtime of
'opt -basicaa -licm out.opt.ll’ from 130ms to 67ms and the runtime of
'opt -basicaa -licm out.opt2.ll’ from 117ms to 62ms (out.opt.ll and
out.opt2.ll can be found on the following link
https://llvm.org/bugs/show_bug.cgi?id=23077).

P.S.: Thank you again for the explanation. I think that, in the case
of the Bug 23077, getModRefInfo works correctly. If we modify, for
example, out.opt.ll and change the third parameter of ‘llvm.memset.*’
intrinsics from i64 256 to, for example, i64 512, there is aliasing.
Furthermore, I’ve manually created objects of the MemoryLocation
class, which are corresponds to ‘llvm.memset.*’ intrinsics, and
checked whether they alias each other. The result corresponds to a
result of getModRefInfo.

0001-Mark-unknown-instructions-from-the-AST-parameter.patch (1.77 KB)

Hi Hal,

I'm sorry for disturbing you again. Could you please advise whom to
contact regarding a review of this patch?