[llvm] [Coroutines] Refactor CoroShape::buildFrom for future use by ABI objects (PR #108623)

Tyler Nowicki via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 16 15:12:54 PDT 2024


================
@@ -50,15 +50,49 @@ enum class ABI {
 // Holds structural Coroutine Intrinsics for a particular function and other
 // values used during CoroSplit pass.
 struct LLVM_LIBRARY_VISIBILITY Shape {
-  CoroBeginInst *CoroBegin;
+  CoroBeginInst *CoroBegin = nullptr;
   SmallVector<AnyCoroEndInst *, 4> CoroEnds;
   SmallVector<CoroSizeInst *, 2> CoroSizes;
   SmallVector<CoroAlignInst *, 2> CoroAligns;
   SmallVector<AnyCoroSuspendInst *, 4> CoroSuspends;
-  SmallVector<CallInst *, 2> SwiftErrorOps;
   SmallVector<CoroAwaitSuspendInst *, 4> CoroAwaitSuspends;
   SmallVector<CallInst *, 2> SymmetricTransfers;
 
+  // Values invalidated by invalidateCoroutine() and tidyCoroutine()
+  SmallVector<CoroFrameInst *, 8> CoroFrames;
+  SmallVector<CoroSaveInst *, 2> UnusedCoroSaves;
----------------
TylerNowicki wrote:

Right, they were on the stack in buildFrame. In my commit message I called them out because they are now part of the Shape struct itself.
 
The methods both will erase the Insts in the SmallVectors. For example, invalidateCoroutine() erases CoroFrameInsts within the CoroFrames SmallVector using eraseFromParent. The method does not then clear CoroFrames. Using an inst  after eraseFromParent() can be a bit dangerous, for example, calling eraseFromParent again will trigger an exception. I realized that I should clear the SmallVectors after they are handled by invalidateCoroutine() and clearCoroutine(). I updated the patch to do this (sorry about the accidental force push).

https://github.com/llvm/llvm-project/pull/108623


More information about the llvm-commits mailing list