[Scalarizer] Fix potential for stale data in Scattered across invocations
authorMatt Wala <wala@google.com>
Fri, 12 Jun 2015 22:49:11 +0000 (22:49 +0000)
committerMatt Wala <wala@google.com>
Fri, 12 Jun 2015 22:49:11 +0000 (22:49 +0000)
commit1f48192d7ce23d5e36631398b087e8822cb289c1
tree6daba7cae35fa372ac94a89b7f699bd7e05f2d58
parentd918ff62e558fdf2ef97c6260ca08fc22a0c9ab4
[Scalarizer] Fix potential for stale data in Scattered across invocations

Summary:
Scalarizer has two data structures that hold information about changes
to the function, Gathered and Scattered. These are cleared in finish()
at the end of runOnFunction() if finish() detects any changes to the
function.

However, finish() was checking for changes by only checking if
Gathered was non-empty. The function visitStore() only modifies
Scattered without touching Gathered. As a result, Scattered could have
ended up having stale data if Scalarizer only scalarized store
instructions. Since the data in Scattered is used during the execution
of the pass, this introduced dangling pointer errors.

The fix is to check whether both Scattered and Gathered are empty
before deciding what to do in finish().

Reviewers: srhines

Reviewed By: srhines

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D10422

llvm-svn: 239644
llvm/lib/Transforms/Scalar/Scalarizer.cpp