[Coroutines] Part15c: Fix coro-split to correctly handle definitions between coro...
authorGor Nishanov <GorNishanov@gmail.com>
Fri, 30 Sep 2016 19:24:19 +0000 (19:24 +0000)
committerGor Nishanov <GorNishanov@gmail.com>
Fri, 30 Sep 2016 19:24:19 +0000 (19:24 +0000)
commita263a60ad5c6b299c23c86c440c69a3ff98bbcd5
treef434234b39f2d6dcfb683b797699f9af7149fdba
parent75b25187627bbf78453f2cefb24fa28a07ceb289
[Coroutines] Part15c: Fix coro-split to correctly handle definitions between coro.save and coro.suspend

Summary:
In the case below, %Result.i19 is defined between coro.save and coro.suspend and used after coro.suspend. We need to correctly place such a value into the coroutine frame.

```
  %save = call token @llvm.coro.save(i8* null)
  %Result.i19 = getelementptr inbounds %"struct.lean_future<int>::Awaiter", %"struct.lean_future<int>::Awaiter"* %ref.tmp7, i64 0, i32 0
  %suspend = call i8 @llvm.coro.suspend(token %save, i1 false)
  switch i8 %suspend, label %exit [
    i8 0, label %await.ready
    i8 1, label %exit
  ]
await.ready:
  %val = load i32, i32* %Result.i19

```

Reviewers: majnemer

Subscribers: llvm-commits, mehdi_amini

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

llvm-svn: 282902
llvm/lib/Transforms/Coroutines/CoroFrame.cpp
llvm/test/Transforms/Coroutines/coro-split-02.ll [new file with mode: 0644]