From: Cuong Manh Le Date: Fri, 29 Mar 2024 08:00:09 +0000 (+0700) Subject: cmd/compile: add missing OINLCAll case in mayModifyPkgVar X-Git-Tag: go1.23rc1~737 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=9a028e14a535795a4783ce9e859a8649e903bfe9;p=gostls13.git 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 --- 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") + } +}