diff options
Diffstat (limited to 'backport-0018-release-branch.go1.21-cmd-compile-fix-findIndVar-so-.patch')
-rw-r--r-- | backport-0018-release-branch.go1.21-cmd-compile-fix-findIndVar-so-.patch | 91 |
1 files changed, 91 insertions, 0 deletions
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 <jorropo.pgm@gmail.com> +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 <heschi@google.com> +Reviewed-by: Keith Randall <khr@golang.org> +Reviewed-by: Keith Randall <khr@google.com> +LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> +(cherry picked from commit 8b4e1259d0e82c8fe38a1456f997a4e9d63573a2) +Reviewed-on: https://go-review.googlesource.com/c/go/+/540535 +Reviewed-by: Jorropo <jorropo.pgm@gmail.com> +Reviewed-by: Mauri de Souza Meneguzzo <mauri870@gmail.com> +Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> +Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org> +Auto-Submit: Dmitri Shuralyov <dmitshur@google.com> +Reviewed-by: Michael Knyszek <mknyszek@google.com> +--- + 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 + |