mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-18 11:33:59 +00:00
transform (coroutines): move any misplaced entry-block allocas to the start of the entry block before lowering
This commit is contained in:
@@ -763,6 +763,27 @@ func (c *coroutineLoweringPass) lowerCallReturn(caller *asyncFunc, call llvm.Val
|
|||||||
// lowerFuncCoro transforms an async function into a coroutine by lowering async operations to `llvm.coro` intrinsics.
|
// lowerFuncCoro transforms an async function into a coroutine by lowering async operations to `llvm.coro` intrinsics.
|
||||||
// See https://llvm.org/docs/Coroutines.html for more information on these intrinsics.
|
// See https://llvm.org/docs/Coroutines.html for more information on these intrinsics.
|
||||||
func (c *coroutineLoweringPass) lowerFuncCoro(fn *asyncFunc) {
|
func (c *coroutineLoweringPass) lowerFuncCoro(fn *asyncFunc) {
|
||||||
|
// Ensure that any alloca instructions in the entry block are at the start.
|
||||||
|
// Otherwise, block splitting would result in unintended behavior.
|
||||||
|
{
|
||||||
|
// Skip alloca instructions at the start of the block.
|
||||||
|
inst := fn.fn.FirstBasicBlock().FirstInstruction()
|
||||||
|
for !inst.IsAAllocaInst().IsNil() {
|
||||||
|
inst = llvm.NextInstruction(inst)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find any other alloca instructions and move them after the other allocas.
|
||||||
|
c.builder.SetInsertPointBefore(inst)
|
||||||
|
for !inst.IsNil() {
|
||||||
|
next := llvm.NextInstruction(inst)
|
||||||
|
if !inst.IsAAllocaInst().IsNil() {
|
||||||
|
inst.RemoveFromParentAsInstruction()
|
||||||
|
c.builder.Insert(inst)
|
||||||
|
}
|
||||||
|
inst = next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
returnType := fn.fn.Type().ElementType().ReturnType()
|
returnType := fn.fn.Type().ElementType().ReturnType()
|
||||||
|
|
||||||
// Prepare coroutine state.
|
// Prepare coroutine state.
|
||||||
|
|||||||
Reference in New Issue
Block a user