diff --git a/llvm/lib/Transforms/Coroutines/SpillUtils.cpp b/llvm/lib/Transforms/Coroutines/SpillUtils.cpp index e8609af992122..58e83ea83d521 100644 --- a/llvm/lib/Transforms/Coroutines/SpillUtils.cpp +++ b/llvm/lib/Transforms/Coroutines/SpillUtils.cpp @@ -118,29 +118,35 @@ static Instruction *splitBeforeCatchSwitch(CatchSwitchInst *CatchSwitch) { // We use a pointer use visitor to track how an alloca is being used. // The goal is to be able to answer the following three questions: -// 1. Should this alloca be allocated on the frame instead. -// 2. Could the content of the alloca be modified prior to CoroBegn, which would -// require copying the data from alloca to the frame after CoroBegin. -// 3. Is there any alias created for this alloca prior to CoroBegin, but used -// after CoroBegin. In that case, we will need to recreate the alias after -// CoroBegin based off the frame. To answer question 1, we track two things: -// a. List of all BasicBlocks that use this alloca or any of the aliases of +// 1. Should this alloca be allocated on the frame instead. +// 2. Could the content of the alloca be modified prior to CoroBegin, which +// would require copying the data from the alloca to the frame after +// CoroBegin. +// 3. Are there any aliases created for this alloca prior to CoroBegin, but +// used after CoroBegin. In that case, we will need to recreate the alias +// after CoroBegin based off the frame. +// +// To answer question 1, we track two things: +// A. List of all BasicBlocks that use this alloca or any of the aliases of // the alloca. In the end, we check if there exists any two basic blocks that -// cross suspension points. If so, this alloca must be put on the frame. b. -// Whether the alloca or any alias of the alloca is escaped at some point, +// cross suspension points. If so, this alloca must be put on the frame. +// B. Whether the alloca or any alias of the alloca is escaped at some point, // either by storing the address somewhere, or the address is used in a // function call that might capture. If it's ever escaped, this alloca must be // put on the frame conservatively. +// // To answer quetion 2, we track through the variable MayWriteBeforeCoroBegin. // Whenever a potential write happens, either through a store instruction, a // function call or any of the memory intrinsics, we check whether this -// instruction is prior to CoroBegin. To answer question 3, we track the offsets -// of all aliases created for the alloca prior to CoroBegin but used after -// CoroBegin. std::optional is used to be able to represent the case when the -// offset is unknown (e.g. when you have a PHINode that takes in different -// offset values). We cannot handle unknown offsets and will assert. This is the -// potential issue left out. An ideal solution would likely require a -// significant redesign. +// instruction is prior to CoroBegin. +// +// To answer question 3, we track the offsets of all aliases created for the +// alloca prior to CoroBegin but used after CoroBegin. std::optional is used to +// be able to represent the case when the offset is unknown (e.g. when you have +// a PHINode that takes in different offset values). We cannot handle unknown +// offsets and will assert. This is the potential issue left out. An ideal +// solution would likely require a significant redesign. + namespace { struct AllocaUseVisitor : PtrUseVisitor { using Base = PtrUseVisitor;