summaryrefslogtreecommitdiff
path: root/backport-0018-release-branch.go1.21-cmd-compile-fix-findIndVar-so-.patch
diff options
context:
space:
mode:
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-.patch91
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
+