OSDN Git Service

[Coroutines] Part 9: Add cleanup subfunction.
authorGor Nishanov <GorNishanov@gmail.com>
Mon, 29 Aug 2016 14:34:12 +0000 (14:34 +0000)
committerGor Nishanov <GorNishanov@gmail.com>
Mon, 29 Aug 2016 14:34:12 +0000 (14:34 +0000)
commitbce16c69f05f533489e78460c9ec4da1126036b8
tree3c03933af9b2fab52a9aa9ed4034f26efa7266a1
parentbbb2e05d37e43b046653814075a966a6cf78f9e3
[Coroutines] Part 9: Add cleanup subfunction.

Summary:
[Coroutines] Part 9: Add cleanup subfunction.

This patch completes coroutine heap allocation elision. Now, the heap elision example from docs\Coroutines.rst compiles and produces expected result (see test/Transform/Coroutines/ex3.ll)

Intrinsic Changes:
* coro.free gets a token parameter tying it to coro.id to allow reliably discovering all coro.frees associated with a particular coroutine.
* coro.id gets an extra parameter that points back to a coroutine function. This allows to check whether a coro.id describes the enclosing function or it belongs to a different function that was later inlined.

CoroSplit now creates three subfunctions:
# f$resume - resume logic
# f$destroy - cleanup logic, followed by a deallocation code
# f$cleanup - just the cleanup code

CoroElide pass during devirtualization replaces coro.destroy with either f$destroy or f$cleanup depending whether heap elision is performed or not.

Other fixes, improvements:
* Fixed buglet in Shape::buildFrame that was not creating coro.save properly if coroutine has more than one suspend point.

* Switched to using variable width suspend index field (no longer limited to 32 bit index field can be as little as i1 or as large as i<whatever-size_t-is>)

Reviewers: majnemer

Subscribers: llvm-commits, mehdi_amini

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@279971 91177308-0d34-0410-b5e6-96231b3b80d8
19 files changed:
docs/Coroutines.rst
include/llvm/IR/Intrinsics.td
lib/IR/Verifier.cpp
lib/Transforms/Coroutines/CoroEarly.cpp
lib/Transforms/Coroutines/CoroElide.cpp
lib/Transforms/Coroutines/CoroFrame.cpp
lib/Transforms/Coroutines/CoroInstr.h
lib/Transforms/Coroutines/CoroInternal.h
lib/Transforms/Coroutines/CoroSplit.cpp
lib/Transforms/Coroutines/Coroutines.cpp
test/Transforms/Coroutines/coro-elide.ll
test/Transforms/Coroutines/coro-heap-elide.ll
test/Transforms/Coroutines/coro-split-00.ll
test/Transforms/Coroutines/coro-split-01.ll
test/Transforms/Coroutines/ex0.ll
test/Transforms/Coroutines/ex1.ll
test/Transforms/Coroutines/ex2.ll [new file with mode: 0644]
test/Transforms/Coroutines/ex3.ll [new file with mode: 0644]
test/Transforms/Coroutines/restart-trigger.ll