summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms
diff options
context:
space:
mode:
authorGor Nishanov <GorNishanov@gmail.com>2017-06-02 02:18:36 +0000
committerGor Nishanov <GorNishanov@gmail.com>2017-06-02 02:18:36 +0000
commit053d2d24f7252008af8048a6bd52110145c07aee (patch)
tree2cf7bbb5589fb0b5cb844cd60299a465571b88b5 /llvm/test/Transforms
parent621e8dcf1f093d36d572cbb96e28c304cc0b2d74 (diff)
downloadbcm5719-llvm-053d2d24f7252008af8048a6bd52110145c07aee.tar.gz
bcm5719-llvm-053d2d24f7252008af8048a6bd52110145c07aee.zip
[coroutines] PR33271: Remove stray coro.save intrinsics during CoroSplit
Summary: Optimization passes may remove llvm.coro.suspend intrinsic while leaving matching llvm.coro.save intrinsic orphaned. Make sure we clean up orphaned coro.saves. The bug manifested with a crash similar to this: ``` llvm_unreachable("Unknown type!"); llvm::MVT::getVT (Ty=0x489518, HandleUnknown=false) llvm::EVT::getEVT llvm::TargetLoweringBase::getValueType llvm::ComputeValueVTs llvm::SelectionDAGBuilder::visitTargetIntrinsic ``` Reviewers: GorNishanov Subscribers: EricWF, llvm-commits Differential Revision: https://reviews.llvm.org/D33817 llvm-svn: 304518
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r--llvm/test/Transforms/Coroutines/coro-split-02.ll5
1 files changed, 4 insertions, 1 deletions
diff --git a/llvm/test/Transforms/Coroutines/coro-split-02.ll b/llvm/test/Transforms/Coroutines/coro-split-02.ll
index 953c2508865..4dc8921cd69 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-02.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-02.ll
@@ -1,5 +1,6 @@
; Tests that coro-split can handle the case when a code after coro.suspend uses
; a value produces between coro.save and coro.suspend (%Result.i19)
+; and checks whether stray coro.saves are properly removed
; RUN: opt < %s -coro-split -S | FileCheck %s
%"struct.std::coroutine_handle" = type { i8* }
@@ -24,9 +25,10 @@ entry:
i8 1, label %exit
]
await.ready:
+ %StrayCoroSave = call token @llvm.coro.save(i8* null)
%val = load i32, i32* %Result.i19
call void @print(i32 %val)
- br label %exit
+ br label %exit
exit:
call i1 @llvm.coro.end(i8* null, i1 false)
ret void
@@ -35,6 +37,7 @@ exit:
; CHECK-LABEL: @a.resume(
; CHECK: getelementptr inbounds %a.Frame
; CHECK-NEXT: getelementptr inbounds %"struct.lean_future<int>::Awaiter"
+; CHECK-NOT: call token @llvm.coro.save(i8* null)
; CHECK-NEXT: %val = load i32, i32* %Result
; CHECK-NEXT: call void @print(i32 %val)
; CHECK-NEXT: ret void
OpenPOWER on IntegriCloud