[Scalarizer] Fix potential for stale data in Scattered across invocations
authorMatt Wala <wala@google.com>
Thu, 23 Jul 2015 20:53:46 +0000 (20:53 +0000)
committerMatt Wala <wala@google.com>
Thu, 23 Jul 2015 20:53:46 +0000 (20:53 +0000)
commit878c144f8a32336daa2c0124017ec707924cfcc0
tree493fd905076a1bcffc30f824a77fef030cc580a3
parentdccc30a7efe2e20b4263ca50171aaae55ef6b5a2
[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(). This also fixes a problem
where the Function can be modified although the pass returns false.

Reviewers: rnk

Subscribers: rnk, srhines, llvm-commits

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

llvm-svn: 243040
llvm/lib/Transforms/Scalar/Scalarizer.cpp
llvm/test/Transforms/Scalarizer/store-bug.ll [new file with mode: 0644]