From 9a028e14a535795a4783ce9e859a8649e903bfe9 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Fri, 29 Mar 2024 15:00:09 +0700 Subject: [PATCH] cmd/compile: add missing OINLCAll case in mayModifyPkgVar CL 395541 made staticopy safe, stop applying the optimization once seeing an expression that may modify global variables. However, if a call expression was inlined, the analyzer mis-recognizes and think that the expression is safe. For example: var x = 0 var a = f() var b = x are re-written to: var x = 0 var a = ~r0 var b = 0 even though it's not safe because "f()" may modify "x". Fixing this by recognizing OINLCALL and mark the initialization as not safe for staticopy. Fixes #66585 Change-Id: Id930c0b7e74274195f54a498cc4c5a91c4e6d84d Reviewed-on: https://go-review.googlesource.com/c/go/+/575175 Reviewed-by: Keith Randall Reviewed-by: Keith Randall Auto-Submit: Cuong Manh Le Reviewed-by: Than McIntosh LUCI-TryBot-Result: Go LUCI --- src/cmd/compile/internal/staticinit/sched.go | 3 +++ test/fixedbugs/issue66585.go | 25 ++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 test/fixedbugs/issue66585.go diff --git a/src/cmd/compile/internal/staticinit/sched.go b/src/cmd/compile/internal/staticinit/sched.go index 4191f6997e..6221f79625 100644 --- a/src/cmd/compile/internal/staticinit/sched.go +++ b/src/cmd/compile/internal/staticinit/sched.go @@ -890,6 +890,9 @@ func mayModifyPkgVar(n ir.Node) bool { case ir.OCALLFUNC, ir.OCALLINTER: return !ir.IsFuncPCIntrinsic(n.(*ir.CallExpr)) + case ir.OINLCALL: + return true + case ir.OAPPEND, ir.OCLEAR, ir.OCOPY: return true // could mutate a global array diff --git a/test/fixedbugs/issue66585.go b/test/fixedbugs/issue66585.go new file mode 100644 index 0000000000..fdadf59d63 --- /dev/null +++ b/test/fixedbugs/issue66585.go @@ -0,0 +1,25 @@ +// run + +// Copyright 2024 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 + +var x = 0 +var a = foo() +var b = x + +func foo() int { + x++ + return x +} + +func main() { + if a != 1 { + panic("unexpected a value") + } + if b != 1 { + panic("unexpected b value") + } +} -- 2.50.0