llvm/test/Transforms/Coroutines
Gor Nishanov a1184492ba [coroutines] Store an address of destroy OR cleanup part in the coroutine frame.
Summary:
If heap allocation of a coroutine is elided, we need to make sure that we will update an address stored in the coroutine frame from f.destroy to f.cleanup.
Before this change, CoroSplit synthesized these stores after coro.begin:

```
    store void (%f.Frame*)* @f.resume, void (%f.Frame*)** %resume.addr
    store void (%f.Frame*)* @f.destroy, void (%f.Frame*)** %destroy.addr

```

In those cases where we did heap elision, but were not able to devirtualize all indirect calls, destroy call will attempt to "free" the coroutine frame stored on the stack. Oops.

Now we use select to put an appropriate coroutine subfunction in the destroy slot. As bellow:

```
    store void (%f.Frame*)* @f.resume, void (%f.Frame*)** %resume.addr
    %0 = select i1 %need.alloc, void (%f.Frame*)* @f.destroy, void (%f.Frame*)* @f.cleanup
    store void (%f.Frame*)* %0, void (%f.Frame*)** %destroy.addr
```

Reviewers: majnemer

Subscribers: mehdi_amini, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@283625 91177308-0d34-0410-b5e6-96231b3b80d8
2016-10-08 00:22:50 +00:00
..
ArgAddr.ll [Coroutines] Part12: Handle alloca address-taken 2016-09-05 23:45:45 +00:00
coro-cleanup.ll [Coroutines] Part 15a: Lower coro.subfn.addr in CoroCleanup 2016-09-30 18:41:35 +00:00
coro-early.ll Part 4c: Coroutine Devirtualization: Devirtualize coro.resume and coro.destroy. 2016-08-06 02:16:35 +00:00
coro-elide.ll [Coroutines] Part 9: Add cleanup subfunction. 2016-08-29 14:34:12 +00:00
coro-heap-elide.ll [Coroutines] Part 9: Add cleanup subfunction. 2016-08-29 14:34:12 +00:00
coro-split-00.ll [coroutines] Store an address of destroy OR cleanup part in the coroutine frame. 2016-10-08 00:22:50 +00:00
coro-split-01.ll [Coroutines] Part 9: Add cleanup subfunction. 2016-08-29 14:34:12 +00:00
coro-split-02.ll [Coroutines] Part15c: Fix coro-split to correctly handle definitions between coro.save and coro.suspend 2016-09-30 19:24:19 +00:00
coro-split-dbg.ll [Coroutines] Part15b: Fix dbg information handling in coro-split. 2016-09-30 19:05:06 +00:00
ex0.ll [Coroutines] Part 9: Add cleanup subfunction. 2016-08-29 14:34:12 +00:00
ex1.ll [Coroutines] Part 9: Add cleanup subfunction. 2016-08-29 14:34:12 +00:00
ex2.ll [Coroutines] Part 9: Add cleanup subfunction. 2016-08-29 14:34:12 +00:00
ex3.ll [Coroutines] Part 9: Add cleanup subfunction. 2016-08-29 14:34:12 +00:00
ex4.ll [Coroutines] Part 10: Add coroutine promise support. 2016-08-31 00:35:41 +00:00
ex5.ll [Coroutines] Part11: Add final suspend handling. 2016-09-05 04:44:30 +00:00
no-suspend.ll [Coroutines] Part14: Handle coroutines with no suspend points. 2016-09-26 15:49:28 +00:00
phi-coro-end.ll [Coroutines] Part13: Handle single edge PHINodes across suspends 2016-09-09 05:39:00 +00:00
restart-trigger.ll [Coroutines] Part 9: Add cleanup subfunction. 2016-08-29 14:34:12 +00:00
smoketest.ll [Coroutines] Part 8: Coroutine Frame Building algorithm 2016-08-24 04:44:35 +00:00