Add a new visitor for walking the uses of a pointer value.
authorChandler Carruth <chandlerc@gmail.com>
Mon, 10 Dec 2012 08:28:39 +0000 (08:28 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Mon, 10 Dec 2012 08:28:39 +0000 (08:28 +0000)
commited90ed077a58d6eff6aede206273ae0aeefa3a94
treed6204735bcf5ce7bc0c16b680b56354245e02e17
parent48b509c77318cc6e753513ca5dcdd67e18094235
Add a new visitor for walking the uses of a pointer value.

This visitor provides infrastructure for recursively traversing the
use-graph of a pointer-producing instruction like an alloca or a malloc.
It maintains a worklist of uses to visit, so it can handle very deep
recursions. It automatically looks through instructions which simply
translate one pointer to another (bitcasts and GEPs). It tracks the
offset relative to the original pointer as long as that offset remains
constant and exposes it during the visit as an APInt offset. Finally, it
performs conservative escape analysis.

However, currently it has some limitations that should be addressed
going forward:
1) It doesn't handle vectors of pointers.
2) It doesn't provide a cheaper visitor when the constant offset
   tracking isn't needed.
3) It doesn't support non-instruction pointer values.

The current functionality is exactly what is required to implement the
SROA pointer-use visitors in terms of this one, rather than in terms of
their own ad-hoc base visitor, which was always very poorly specified.
SROA has been converted to use this, and the code there deleted which
this utility now provides.

Technically speaking, using this new visitor allows SROA to handle a few
more cases than it previously did. It is now more aggressive in ignoring
chains of instructions which look like they would defeat SROA, but in
fact do not because they never result in a read or write of memory.
While this is "neat", it shouldn't be interesting for real programs as
any such chains should have been removed by others passes long before we
get to SROA. As a consequence, I've not added any tests for these
features -- it shouldn't be part of SROA's contract to perform such
heroics.

The goal is to extend the functionality of this visitor going forward,
and re-use it from passes like ASan that can benefit from doing
a detailed walk of the uses of a pointer.

Thanks to Ben Kramer for the code review rounds and lots of help
reviewing and debugging this patch.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169728 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Analysis/PtrUseVisitor.h [new file with mode: 0644]
lib/Analysis/CMakeLists.txt
lib/Analysis/PtrUseVisitor.cpp [new file with mode: 0644]
lib/Transforms/Scalar/SROA.cpp