Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions test/codegen/llvm_defer.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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() {
}
23 changes: 23 additions & 0 deletions test/llvm_defer.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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")
}
Expand Down