]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't move nilCheck operations during tighten
authorKeith Randall <khr@golang.org>
Thu, 13 Mar 2025 23:15:15 +0000 (16:15 -0700)
committerKeith Randall <khr@google.com>
Fri, 14 Mar 2025 04:24:20 +0000 (21:24 -0700)
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>
src/cmd/compile/internal/ssa/tighten.go
test/fixedbugs/issue72860.go [new file with mode: 0644]

index 85b6a84cc3f426c905160af30fe6622a360fc1c7..f3056d42aa8171206338eb0f7bf63d71793beba3 100644 (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 {
diff --git a/test/fixedbugs/issue72860.go b/test/fixedbugs/issue72860.go
new file mode 100644 (file)
index 0000000..5b6199d
--- /dev/null
@@ -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)
+}