cmd/compile: fix findIndVar so it does not match disjointed loop headers Signed-off-by: EulerOSWander <314264452@qq.com> (cherry picked from commit 9d7cc4fab07218f896e6a9265a231f5108d53135)
92 lines
3.2 KiB
Diff
92 lines
3.2 KiB
Diff
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
|
|
|