summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/RewriteStatepointsForGC/unreachable-regression.ll
diff options
context:
space:
mode:
authorDaniel Neilson <dneilson@azul.com>2018-03-05 22:27:30 +0000
committerDaniel Neilson <dneilson@azul.com>2018-03-05 22:27:30 +0000
commit82daad31fea78a9c75fcbbe79ce7070e642640d0 (patch)
tree90cbd7f362b6772caf6724cf0469550860daf08d /llvm/test/Transforms/RewriteStatepointsForGC/unreachable-regression.ll
parent74ff6ff437a6dd68e38dcbb50fde3f09690364d5 (diff)
downloadbcm5719-llvm-82daad31fea78a9c75fcbbe79ce7070e642640d0.tar.gz
bcm5719-llvm-82daad31fea78a9c75fcbbe79ce7070e642640d0.zip
[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
Diffstat (limited to 'llvm/test/Transforms/RewriteStatepointsForGC/unreachable-regression.ll')
-rw-r--r--llvm/test/Transforms/RewriteStatepointsForGC/unreachable-regression.ll34
1 files changed, 34 insertions, 0 deletions
diff --git a/llvm/test/Transforms/RewriteStatepointsForGC/unreachable-regression.ll b/llvm/test/Transforms/RewriteStatepointsForGC/unreachable-regression.ll
new file mode 100644
index 00000000000..1f781a4ce19
--- /dev/null
+++ b/llvm/test/Transforms/RewriteStatepointsForGC/unreachable-regression.ll
@@ -0,0 +1,34 @@
+; RUN: opt -S -rewrite-statepoints-for-gc < %s | FileCheck %s
+; RUN: opt -S -passes=rewrite-statepoints-for-gc < %s | FileCheck %s
+;
+; Regression test:
+; After the rewritable callsite collection if any callsite was found
+; in a block that was reported unreachable by DominanceTree then
+; removeUnreachableBlocks() was called. But it is stronger than
+; DominatorTree::isReachableFromEntry(), i.e. removeUnreachableBlocks
+; can remove some blocks for which isReachableFromEntry() returns true.
+; This resulted in stale pointers to the collected but removed
+; callsites. Such stale pointers caused crash when accessed.
+declare void @f(i8 addrspace(1)* %obj)
+
+define void @test(i8 addrspace(1)* %arg) gc "statepoint-example" {
+; CHECK-LABEL: test(
+; CHECK-NEXT: @f
+ call void @f(i8 addrspace(1)* %arg) #1
+ br i1 true, label %not_zero, label %zero
+
+not_zero:
+ ret void
+
+; This block is reachable but removed by removeUnreachableBlocks()
+zero:
+; CHECK-NOT: @f
+ call void @f(i8 addrspace(1)* %arg) #1
+ ret void
+
+unreach:
+ call void @f(i8 addrspace(1)* %arg) #1
+ ret void
+}
+
+attributes #1 = { norecurse noimplicitfloat }
OpenPOWER on IntegriCloud