Commit 0b6fbaae authored by David Chase's avatar David Chase

cmd/compile: make loop guard+rotate conditional on GOEXPERIMENT

Loops of the form "for i,e := range" needed to have their
condition rotated to the "bottom" for the preemptible loops
GOEXPERIMENT, but this caused a performance regression
because it degraded bounds check removal.  For now, make
the loop rotation/guarding conditional on the experiment.

Fixes #20711.
Updates #10958.

Change-Id: Icfba14cb3b13a910c349df8f84838cf4d9d20cf6
Reviewed-on: https://go-review.googlesource.com/46410
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarKeith Randall <khr@golang.org>
parent c4e0e816
...@@ -6,6 +6,7 @@ package gc ...@@ -6,6 +6,7 @@ package gc
import ( import (
"cmd/compile/internal/types" "cmd/compile/internal/types"
"cmd/internal/objabi"
"unicode/utf8" "unicode/utf8"
) )
...@@ -211,9 +212,13 @@ func walkrange(n *Node) *Node { ...@@ -211,9 +212,13 @@ func walkrange(n *Node) *Node {
} else if v2 == nil { } else if v2 == nil {
body = []*Node{nod(OAS, v1, hv1)} body = []*Node{nod(OAS, v1, hv1)}
} else { // for i,a := range thing { body } } else { // for i,a := range thing { body }
if objabi.Preemptibleloops_enabled != 0 {
// Doing this transformation makes a bounds check removal less trivial; see #20711
// TODO enhance the preemption check insertion so that this transformation is not necessary.
ifGuard = nod(OIF, nil, nil) ifGuard = nod(OIF, nil, nil)
ifGuard.Left = nod(OLT, hv1, hn) ifGuard.Left = nod(OLT, hv1, hn)
translatedLoopOp = OFORUNTIL translatedLoopOp = OFORUNTIL
}
a := nod(OAS2, nil, nil) a := nod(OAS2, nil, nil)
a.List.Set2(v1, v2) a.List.Set2(v1, v2)
......
...@@ -31,7 +31,7 @@ func f0c(a []int) int { ...@@ -31,7 +31,7 @@ func f0c(a []int) int {
func f1(a []int) int { func f1(a []int) int {
x := 0 x := 0
for _, i := range a { // Change to "for i,e := range array/slice" hides IV report. for _, i := range a { // ERROR "Induction variable with minimum 0 and increment 1"
x += i x += i
} }
return x return x
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment