[clang-tools-extra] [llvm][documentation] Fix coroutines documentation (PR #66420)

Chuanqi Xu via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 18 02:43:56 PDT 2023


https://github.com/ChuanqiXu9 updated https://github.com/llvm/llvm-project/pull/66420

>From 71c5d851d2b14022434fb6533ec7418ee00751c2 Mon Sep 17 00:00:00 2001
From: NoodleSugar <noodle at Noodle-PC.localdomain>
Date: Tue, 12 Sep 2023 12:39:13 +0200
Subject: [PATCH] [llvm][documentation] Fix coroutines documentation

---
 llvm/docs/Coroutines.rst | 25 +++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/llvm/docs/Coroutines.rst b/llvm/docs/Coroutines.rst
index 46dc2dcbee18276..96bc7003b68e984 100644
--- a/llvm/docs/Coroutines.rst
+++ b/llvm/docs/Coroutines.rst
@@ -372,7 +372,7 @@ execution of the coroutine until a suspend point is reached:
     store void (%f.frame*)* @f.destroy, void (%f.frame*)** %2
 
     %inc = add nsw i32 %n, 1
-    %inc.spill.addr = getelementptr inbounds %f.Frame, %f.Frame* %FramePtr, i32 0, i32 2
+    %inc.spill.addr = getelementptr inbounds %f.frame, %f.frame* %frame, i32 0, i32 2
     store i32 %inc, i32* %inc.spill.addr
     call void @print(i32 %n)
 
@@ -387,7 +387,7 @@ Outlined resume part of the coroutine will reside in function `f.resume`:
   entry:
     %inc.spill.addr = getelementptr %f.frame, %f.frame* %frame.ptr.resume, i64 0, i32 2
     %inc.spill = load i32, i32* %inc.spill.addr, align 4
-    %inc = add i32 %n.val, 1
+    %inc = add i32 %inc.spill, 1
     store i32 %inc, i32* %inc.spill.addr, align 4
     tail call void @print(i32 %inc)
     ret void
@@ -497,23 +497,28 @@ as the code in the previous section):
                                   i8 1, label %cleanup]
 
 In this case, the coroutine frame would include a suspend index that will
-indicate at which suspend point the coroutine needs to resume. The resume
-function will use an index to jump to an appropriate basic block and will look
+indicate at which suspend point the coroutine needs to resume.
+
+.. code-block:: llvm
+
+  %f.frame = type { ptr, ptr, i32, i32 }
+
+The resume function will use an index to jump to an appropriate basic block and will look
 as follows:
 
 .. code-block:: llvm
 
-  define internal fastcc void @f.Resume(%f.Frame* %FramePtr) {
-  entry.Resume:
-    %index.addr = getelementptr inbounds %f.Frame, %f.Frame* %FramePtr, i64 0, i32 2
+  define internal fastcc void @f.resume(%f.frame* %FramePtr) {
+  entry.resume:
+    %index.addr = getelementptr inbounds %f.frame, %f.frame* %FramePtr, i64 0, i32 2
     %index = load i8, i8* %index.addr, align 1
     %switch = icmp eq i8 %index, 0
-    %n.addr = getelementptr inbounds %f.Frame, %f.Frame* %FramePtr, i64 0, i32 3
+    %n.addr = getelementptr inbounds %f.frame, %f.frame* %FramePtr, i64 0, i32 3
     %n = load i32, i32* %n.addr, align 4
     br i1 %switch, label %loop.resume, label %loop
 
   loop.resume:
-    %sub = xor i32 %n, -1
+    %sub = sub nsw i32 0, %n
     call void @print(i32 %sub)
     br label %suspend
   loop:
@@ -589,7 +594,7 @@ correct resume point):
     %save2 = call token @llvm.coro.save(i8* %hdl)
     call void @async_op2(i8* %hdl)
     %suspend2 = call i1 @llvm.coro.suspend(token %save2, i1 false)
-    switch i8 %suspend1, label %suspend [i8 0, label %resume2
+    switch i8 %suspend2, label %suspend [i8 0, label %resume2
                                          i8 1, label %cleanup]
 
 .. _coroutine promise:



More information about the cfe-commits mailing list