summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/Coroutines
diff options
context:
space:
mode:
authorJun Ma <JunMa@linux.alibaba.com>2020-03-18 11:42:16 +0800
committerTom Stellard <tstellar@redhat.com>2020-04-29 17:13:34 -0700
commite4312b950dd7b019e14b991a17d6ac260b8e8082 (patch)
treefe927dd2b2e8490fe9af2fba9f9092596f617454 /llvm/test/Transforms/Coroutines
parent9cf9cf2a398ce70d9187afa59db6500e7a1f2cd0 (diff)
downloadbcm5719-llvm-e4312b950dd7b019e14b991a17d6ac260b8e8082.tar.gz
bcm5719-llvm-e4312b950dd7b019e14b991a17d6ac260b8e8082.zip
[Coroutines] Fix PR45130
For now, when final suspend can be simplified by simplifySuspendPoint, handleFinalSuspend is executed as well to remove last case in switch instruction. This patch fixes it. Differential Revision: https://reviews.llvm.org/D76345 (cherry picked from commit 032251e34d17c1cbf21e7571514bb775ed5cdf30)
Diffstat (limited to 'llvm/test/Transforms/Coroutines')
-rw-r--r--llvm/test/Transforms/Coroutines/no-suspend.ll52
1 files changed, 52 insertions, 0 deletions
diff --git a/llvm/test/Transforms/Coroutines/no-suspend.ll b/llvm/test/Transforms/Coroutines/no-suspend.ll
index fca096fa48b..beb2431b7f1 100644
--- a/llvm/test/Transforms/Coroutines/no-suspend.ll
+++ b/llvm/test/Transforms/Coroutines/no-suspend.ll
@@ -361,6 +361,58 @@ suspend:
ret void
}
+; SimplifySuspendPoint should not simplify final suspend point
+;
+; CHECK-LABEL: define void @cannot_simplify_final_suspend(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: llvm.coro.id
+;
+define void @cannot_simplify_final_suspend() "coroutine.presplit"="1" personality i32 0 {
+entry:
+ %id = call token @llvm.coro.id(i32 0, i8* null, i8* null, i8* null)
+ %need.dyn.alloc = call i1 @llvm.coro.alloc(token %id)
+ br i1 %need.dyn.alloc, label %dyn.alloc, label %coro.begin
+dyn.alloc:
+ %size = call i32 @llvm.coro.size.i32()
+ %alloc = call i8* @malloc(i32 %size)
+ br label %coro.begin
+coro.begin:
+ %phi = phi i8* [ null, %entry ], [ %alloc, %dyn.alloc ]
+ %hdl = call noalias i8* @llvm.coro.begin(token %id, i8* %phi)
+ br label %body
+body:
+ %save = call token @llvm.coro.save(i8* %hdl)
+ %subfn = call i8* @llvm.coro.subfn.addr(i8* %hdl, i8 1)
+ %bcast = bitcast i8* %subfn to void (i8*)*
+ invoke fastcc void %bcast(i8* %hdl) to label %real_susp unwind label %lpad
+
+real_susp:
+ %0 = call i8 @llvm.coro.suspend(token %save, i1 1)
+ switch i8 %0, label %suspend [i8 0, label %resume
+ i8 1, label %pre.cleanup]
+resume:
+ call void @print(i32 0)
+ br label %cleanup
+
+pre.cleanup:
+ call void @print(i32 1)
+ br label %cleanup
+
+cleanup:
+ %mem = call i8* @llvm.coro.free(token %id, i8* %hdl)
+ call void @free(i8* %mem)
+ br label %suspend
+suspend:
+ call i1 @llvm.coro.end(i8* %hdl, i1 false)
+ ret void
+lpad:
+ %lpval = landingpad { i8*, i32 }
+ cleanup
+
+ call void @print(i32 2)
+ resume { i8*, i32 } %lpval
+}
+
declare i8* @malloc(i32)
declare void @free(i8*)
declare void @print(i32)
OpenPOWER on IntegriCloud