From a1ddbdd3ef8b739aab53f20d6ed0a61c3474cf12 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Thu, 13 Mar 2025 16:15:15 -0700 Subject: [PATCH] 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 Reviewed-by: Keith Randall LUCI-TryBot-Result: Go LUCI Reviewed-by: Cherry Mui --- src/cmd/compile/internal/ssa/tighten.go | 4 ++++ test/fixedbugs/issue72860.go | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 test/fixedbugs/issue72860.go diff --git a/src/cmd/compile/internal/ssa/tighten.go b/src/cmd/compile/internal/ssa/tighten.go index 85b6a84cc3..f3056d42aa 100644 --- a/src/cmd/compile/internal/ssa/tighten.go +++ b/src/cmd/compile/internal/ssa/tighten.go @@ -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 { diff --git a/test/fixedbugs/issue72860.go b/test/fixedbugs/issue72860.go new file mode 100644 index 0000000000..5b6199da98 --- /dev/null +++ b/test/fixedbugs/issue72860.go @@ -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) +} -- 2.50.0