cmd/compile: don't move nilCheck operations during tighten

Nil checks need to stay in their original blocks. They cannot
be moved to a following conditionally-executed block.

Fixes #72860

Change-Id: Ic2d66cdf030357d91f8a716a004152ba4c016f77
Reviewed-on: https://go-review.googlesource.com/c/go/+/657715
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Keith Randall <khr@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
This commit is contained in:
Keith Randall 2025-03-13 16:15:15 -07:00 committed by Keith Randall
parent 80f068928f
commit a1ddbdd3ef
2 changed files with 28 additions and 0 deletions

View File

@ -43,6 +43,10 @@ func tighten(f *Func) {
// SelectN is typically, ultimately, a register.
continue
}
if opcodeTable[v.Op].nilCheck {
// Nil checks need to stay in their block. See issue 72860.
continue
}
// Count arguments which will need a register.
narg := 0
for _, a := range v.Args {

View File

@ -0,0 +1,24 @@
// run
// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
//go:noinline
func f(p *int, b bool) int {
valid := *p >= 0
if !b || !valid {
return 5
}
return 6
}
func main() {
defer func() {
if e := recover(); e == nil {
println("should have panicked")
}
}()
f(nil, false)
}