diff options
author | Gor Nishanov <GorNishanov@gmail.com> | 2017-06-02 02:18:36 +0000 |
---|---|---|
committer | Gor Nishanov <GorNishanov@gmail.com> | 2017-06-02 02:18:36 +0000 |
commit | 053d2d24f7252008af8048a6bd52110145c07aee (patch) | |
tree | 2cf7bbb5589fb0b5cb844cd60299a465571b88b5 /llvm/test/Transforms | |
parent | 621e8dcf1f093d36d572cbb96e28c304cc0b2d74 (diff) | |
download | bcm5719-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.ll | 5 |
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 |