diff --git a/test/codegen/llvm_defer.go b/test/codegen/llvm_defer.go index 6a11cbcc4132f9..105c6759045dab 100644 --- a/test/codegen/llvm_defer.go +++ b/test/codegen/llvm_defer.go @@ -8,6 +8,10 @@ package codegen var llvmDeferSink int +// LLVM-OPT-LABEL: define goabiinternal void @codegen.llvmDeferSharedSuccessor() +// LLVM-OPT-COUNT-9: callbr void @llvm.go.defer.edge() +// LLVM-OPT-NEXT: to label %[[SHARED_RETURN:[A-Za-z0-9_.]+]] [label %[[SHARED_RETURN]]] + // LLVM-LABEL: define goabiinternal i64 @codegen.llvmDeferStack(i64 %value) // LLVM: call goabiinternal void @runtime.deferprocStack // LLVM: callbr void @llvm.go.defer.edge() @@ -62,3 +66,19 @@ func llvmDeferStack(value int) (result int) { result = 7 return } + +func llvmDeferSharedSuccessor() { + defer llvmDeferredStep() + defer llvmDeferredStep() + defer llvmDeferredStep() + defer llvmDeferredStep() + defer llvmDeferredStep() + defer llvmDeferredStep() + defer llvmDeferredStep() + defer llvmDeferredStep() + defer llvmDeferredStep() +} + +//go:noinline +func llvmDeferredStep() { +} diff --git a/test/llvm_defer.go b/test/llvm_defer.go index ce3d783989f8d4..31a0118429ba54 100644 --- a/test/llvm_defer.go +++ b/test/llvm_defer.go @@ -9,6 +9,25 @@ package main import "runtime" var deferTrace int +var sharedDeferCount int + +//go:noinline +func sharedDeferStep() { + sharedDeferCount++ +} + +//go:noinline +func sharedSuccessorDefers() { + defer sharedDeferStep() + defer sharedDeferStep() + defer sharedDeferStep() + defer sharedDeferStep() + defer sharedDeferStep() + defer sharedDeferStep() + defer sharedDeferStep() + defer sharedDeferStep() + defer sharedDeferStep() +} //go:noinline func normalDefers() (result int) { @@ -74,6 +93,10 @@ func pointerDefer() (result int) { } func main() { + sharedSuccessorDefers() + if sharedDeferCount != 9 { + panic("shared-successor defers did not all run") + } if got := normalDefers(); got != 17 || deferTrace != 21 { panic("normal defer order or named result is incorrect") }