[PATCH] D23117: [coroutines] Part 4b: Coroutine Devirtualization: Handle unwinding coro.resume and coro.destroy.
Gor Nishanov via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 3 12:39:31 PDT 2016
GorNishanov removed rL LLVM as the repository for this revision.
GorNishanov updated this revision to Diff 66693.
GorNishanov added a comment.
Switch to iterating over CallSites per David Majnemer feedback, much prettier now!
https://reviews.llvm.org/D23117
Files:
lib/IR/Verifier.cpp
lib/Transforms/Coroutines/CoroEarly.cpp
test/Transforms/Coroutines/coro-early.ll
Index: test/Transforms/Coroutines/coro-early.ll
===================================================================
--- test/Transforms/Coroutines/coro-early.ll
+++ test/Transforms/Coroutines/coro-early.ll
@@ -20,5 +20,22 @@
; CHECK-NEXT: ret void
}
+; CHECK-LABEL: @eh
+define void @eh(i8* %hdl) personality i8* null {
+; CHECK-NEXT: entry
+entry:
+; CHECK-NEXT: %0 = call i8* @llvm.coro.subfn.addr(i8* %hdl, i8 0)
+; CHECK-NEXT: %1 = bitcast i8* %0 to void (i8*)*
+; CHECK-NEXT: invoke fastcc void %1(i8* %hdl)
+ invoke void @llvm.coro.resume(i8* %hdl)
+ to label %cont unwind label %ehcleanup
+cont:
+ ret void
+
+ehcleanup:
+ %0 = cleanuppad within none []
+ cleanupret from %0 unwind to caller
+}
+
declare void @llvm.coro.resume(i8*)
declare void @llvm.coro.destroy(i8*)
Index: lib/Transforms/Coroutines/CoroEarly.cpp
===================================================================
--- lib/Transforms/Coroutines/CoroEarly.cpp
+++ lib/Transforms/Coroutines/CoroEarly.cpp
@@ -49,18 +49,21 @@
bool Changed = false;
for (auto IB = inst_begin(F), IE = inst_end(F); IB != IE;) {
Instruction &I = *IB++;
- if (auto *II = dyn_cast<IntrinsicInst>(&I)) {
- switch (II->getIntrinsicID()) {
- default:
+ if (auto CS = CallSite(&I)) {
+ if (Function *F = CS.getCalledFunction()) {
+ switch (F->getIntrinsicID()) {
+ default:
+ continue;
+ case Intrinsic::coro_resume:
+ lowerResumeOrDestroy(CS, CoroSubFnInst::ResumeIndex);
+ break;
+ case Intrinsic::coro_destroy:
+ lowerResumeOrDestroy(CS, CoroSubFnInst::DestroyIndex);
+ break;
+ }
+ Changed = true;
continue;
- case Intrinsic::coro_resume:
- lowerResumeOrDestroy(II, CoroSubFnInst::ResumeIndex);
- break;
- case Intrinsic::coro_destroy:
- lowerResumeOrDestroy(II, CoroSubFnInst::DestroyIndex);
- break;
}
- Changed = true;
}
}
return Changed;
Index: lib/IR/Verifier.cpp
===================================================================
--- lib/IR/Verifier.cpp
+++ lib/IR/Verifier.cpp
@@ -3653,11 +3653,13 @@
Assert(
!F->isIntrinsic() || isa<CallInst>(I) ||
F->getIntrinsicID() == Intrinsic::donothing ||
+ F->getIntrinsicID() == Intrinsic::coro_resume ||
+ F->getIntrinsicID() == Intrinsic::coro_destroy ||
F->getIntrinsicID() == Intrinsic::experimental_patchpoint_void ||
F->getIntrinsicID() == Intrinsic::experimental_patchpoint_i64 ||
F->getIntrinsicID() == Intrinsic::experimental_gc_statepoint,
- "Cannot invoke an intrinsic other than donothing, patchpoint or "
- "statepoint",
+ "Cannot invoke an intrinsic other than donothing, patchpoint, "
+ "statepoint, coro_resume or coro_destroy",
&I);
Assert(F->getParent() == M, "Referencing function in another module!",
&I, M, F, F->getParent());
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D23117.66693.patch
Type: text/x-patch
Size: 3034 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160803/c1f76ac1/attachment.bin>
More information about the llvm-commits
mailing list