[RewriteStatepoints] Fix stale parse points
authorDaniel Neilson <dneilson@azul.com>
Mon, 5 Mar 2018 22:27:30 +0000 (22:27 +0000)
committerDaniel Neilson <dneilson@azul.com>
Mon, 5 Mar 2018 22:27:30 +0000 (22:27 +0000)
commit82daad31fea78a9c75fcbbe79ce7070e642640d0
tree90cbd7f362b6772caf6724cf0469550860daf08d
parent74ff6ff437a6dd68e38dcbb50fde3f09690364d5
[RewriteStatepoints] Fix stale parse points

Summary:
RewriteStatepointsForGC collects parse points for further processing.
During the collection if a callsite is found in an unreachable block
(DominatorTree::isReachableFromEntry()) then all unreachable blocks are
removed by removeUnreachableBlocks(). Some of the removed blocks could
have been reachable according to DominatorTree::isReachableFromEntry().
In this case the collected parse points became stale and resulted in a
crash when accessed.

The fix is to unconditionally canonicalize the IR to
removeUnreachableBlocks and then collect the parse points.

The added test crashes with the old version and passes with this patch.

Patch by Yevgeny Rouban!

Reviewed by: Anna

Differential Revision: https://reviews.llvm.org/D43929

llvm-svn: 326748
llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
llvm/test/Transforms/RewriteStatepointsForGC/relocation.ll
llvm/test/Transforms/RewriteStatepointsForGC/unreachable-regression.ll [new file with mode: 0644]
llvm/test/Transforms/RewriteStatepointsForGC/vector-bitcast.ll