From 753da7ae9d4980cf8691aa44f425cc573fcc14a4 Mon Sep 17 00:00:00 2001 From: EulerOSWander <314264452@qq.com> Date: Thu, 1 Aug 2024 15:32:35 +0800 Subject: [PATCH] cmd/compile: fix findIndVar so it does not match disjointed loop headers cmd/compile: fix findIndVar so it does not match disjointed loop headers Signed-off-by: EulerOSWander <314264452@qq.com> (cherry picked from commit 9d7cc4fab07218f896e6a9265a231f5108d53135) --- ...o1.21-cmd-compile-fix-findIndVar-so-.patch | 91 +++++++++++++++++++ golang.spec | 7 +- 2 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 backport-0018-release-branch.go1.21-cmd-compile-fix-findIndVar-so-.patch diff --git a/backport-0018-release-branch.go1.21-cmd-compile-fix-findIndVar-so-.patch b/backport-0018-release-branch.go1.21-cmd-compile-fix-findIndVar-so-.patch new file mode 100644 index 0000000..fbd8b6a --- /dev/null +++ b/backport-0018-release-branch.go1.21-cmd-compile-fix-findIndVar-so-.patch @@ -0,0 +1,91 @@ +From 4ef68a16e21a2e63f2f6bdc498fe34c9ca994011 Mon Sep 17 00:00:00 2001 +From: Jorropo +Date: Sun, 5 Nov 2023 22:40:01 +0100 +Subject: [PATCH 05/20] [release-branch.go1.21] cmd/compile: fix findIndVar so + it does not match disjointed loop headers + +Fix #63984 + +Conflict:NA +Reference:https://go-review.googlesource.com/c/go/+/539977 + +parseIndVar, prove and maybe more are on the assumption that the loop header +is a single block. This can be wrong, ensure we don't match theses cases we +don't know how to handle. + +In the future we could update them so that they know how to handle such cases +but theses cases seems rare so I don't think the value would be really high. +We could also run a loop canonicalization pass first which could handle this. + +The repro case looks weird because I massaged it so it would crash with the +previous compiler. + +Change-Id: I4aa8afae9e90a17fa1085832250fc1139c97faa6 +Reviewed-on: https://go-review.googlesource.com/c/go/+/539977 +Reviewed-by: Heschi Kreinick +Reviewed-by: Keith Randall +Reviewed-by: Keith Randall +LUCI-TryBot-Result: Go LUCI +(cherry picked from commit 8b4e1259d0e82c8fe38a1456f997a4e9d63573a2) +Reviewed-on: https://go-review.googlesource.com/c/go/+/540535 +Reviewed-by: Jorropo +Reviewed-by: Mauri de Souza Meneguzzo +Reviewed-by: Dmitri Shuralyov +Reviewed-by: Dmitri Shuralyov +Auto-Submit: Dmitri Shuralyov +Reviewed-by: Michael Knyszek +--- + src/cmd/compile/internal/ssa/loopbce.go | 7 +++++++ + test/fixedbugs/issue63955.go | 22 ++++++++++++++++++++++ + 2 files changed, 29 insertions(+) + create mode 100644 test/fixedbugs/issue63955.go + +diff --git a/src/cmd/compile/internal/ssa/loopbce.go b/src/cmd/compile/internal/ssa/loopbce.go +index b7dfaa33e3bf..7f432e61ba50 100644 +--- a/src/cmd/compile/internal/ssa/loopbce.go ++++ b/src/cmd/compile/internal/ssa/loopbce.go +@@ -127,6 +127,13 @@ func findIndVar(f *Func) []indVar { + less = false + } + ++ if ind.Block != b { ++ // TODO: Could be extended to include disjointed loop headers. ++ // I don't think this is causing missed optimizations in real world code often. ++ // See https://go.dev/issue/63955 ++ continue ++ } ++ + // Expect the increment to be a nonzero constant. + if !inc.isGenericIntConst() { + continue +diff --git a/test/fixedbugs/issue63955.go b/test/fixedbugs/issue63955.go +new file mode 100644 +index 000000000000..258e874220f0 +--- /dev/null ++++ b/test/fixedbugs/issue63955.go +@@ -0,0 +1,22 @@ ++// compile ++ ++// Copyright 2023 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 j ++ ++func f(try func() int, shouldInc func() bool, N func(int) int) { ++ var n int ++loop: // we want to have 3 preds here, the function entry and both gotos ++ if v := try(); v == 42 || v == 1337 { // the two || are to trick findIndVar ++ if n < 30 { // this aims to be the matched block ++ if shouldInc() { ++ n++ ++ goto loop ++ } ++ n = N(n) // try to prevent some block joining ++ goto loop ++ } ++ } ++} +-- +2.33.0 + diff --git a/golang.spec b/golang.spec index 26e5a8e..b9e3ee2 100644 --- a/golang.spec +++ b/golang.spec @@ -66,7 +66,7 @@ Name: golang Version: 1.21.4 -Release: 19 +Release: 20 Summary: The Go Programming Language License: BSD and Public Domain URL: https://golang.org/ @@ -137,7 +137,8 @@ Patch6013: backport-0013-release-branch.go1.21-net-http-update-bundled-golang.pa Patch6014: backport-0014-cmd-compile-handle-constant-pointer-offsets-in-dead-.patch Patch6015: backport-0015-release-branch.go1.21-cmd-compile-ensure-pointer-ari.patch Patch6016: backport-0016-release-branch.go1.21-internal-poll-add-SPLICE_F_NON.patch -Patch6017: backport-0017-release-branch.go1.21-runtime-call-enableMetadataHug.patch +Patch6017: backport-0017-release-branch.go1.21-runtime-call-enableMetadataHug.patch +Patch6018: backport-0018-release-branch.go1.21-cmd-compile-fix-findIndVar-so-.patch ExclusiveArch: %{golang_arches} @@ -376,6 +377,8 @@ fi %files devel -f go-tests.list -f go-misc.list -f go-src.list %changelog +* Thu Aug 1 2024 EulerOSWander <314264452@qq.com> - 1.21.4-20 +- cmd/compile: fix findIndVar so it does not match disjointed loop headers * Thu Aug 1 2024 EulerOSWander <314264452@qq.com> - 1.21.4-19 - runtime: call enableMetadataHugePages and its callees on the systemstack