[Coroutines] Part13: Handle single edge PHINodes across suspends
authorGor Nishanov <GorNishanov@gmail.com>
Fri, 9 Sep 2016 05:39:00 +0000 (05:39 +0000)
committerGor Nishanov <GorNishanov@gmail.com>
Fri, 9 Sep 2016 05:39:00 +0000 (05:39 +0000)
commitfaf36c2e0b0dd074727e6b40078d87ed02eed117
tree11b69fdacc51f4f0a348a4ead0247d4f20d34b34
parent5f04d819a55a6a9f37216cf13bf5b939d5a48086
[Coroutines] Part13: Handle single edge PHINodes across suspends

Summary:
If one of the uses of the value is a single edge PHINode, handle it.

Original:

    %val = something
    <suspend>
    %p = PHINode [%val]

After Spill + Part13:

    %val = something
    %slot = gep val.spill.slot
    store %val, %slot
    <suspend>
    %p = load %slot

Plus tiny fixes/changes:
   * use correct index for coro.free in CoroCleanup
   * fixup id parameter in coro.free to allow authoring coroutine in plain C with __builtins

Reviewers: majnemer

Subscribers: mehdi_amini, llvm-commits

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

llvm-svn: 281020
llvm/lib/Transforms/Coroutines/CoroCleanup.cpp
llvm/lib/Transforms/Coroutines/CoroEarly.cpp
llvm/lib/Transforms/Coroutines/CoroFrame.cpp
llvm/test/Transforms/Coroutines/phi-coro-end.ll [new file with mode: 0644]