mirror of
https://github.com/golang/go
synced 2024-11-23 17:30:02 -07:00
8893da7c72
The previous rule may move the phi value into a wrong block. This CL make it only rewrite the phi value not the If block, so that the phi value will stay in old block. Fixes #56777 Change-Id: I9479a5c7f28529786968413d35b82a16181bb1f1 Reviewed-on: https://go-review.googlesource.com/c/go/+/451496 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org> Run-TryBot: Wayne Zuo <wdvxdr@golangcn.org> Reviewed-by: Keith Randall <khr@google.com> Reviewed-by: David Chase <drchase@google.com>
57 lines
928 B
Go
57 lines
928 B
Go
// compile
|
|
|
|
// Copyright 2022 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 p
|
|
|
|
func fn(setText []rune, negate bool) int {
|
|
ranges := []singleRange{}
|
|
|
|
if len(setText) > 0 {
|
|
fillFirst := false
|
|
l := len(setText)
|
|
if negate {
|
|
if setText[0] == 0 {
|
|
setText = setText[1:]
|
|
} else {
|
|
l++
|
|
fillFirst = true
|
|
}
|
|
}
|
|
|
|
if l%2 == 0 {
|
|
ranges = make([]singleRange, l/2)
|
|
} else {
|
|
ranges = make([]singleRange, l/2+1)
|
|
}
|
|
|
|
first := true
|
|
if fillFirst {
|
|
ranges[0] = singleRange{first: 0}
|
|
first = false
|
|
}
|
|
|
|
i := 0
|
|
for _, r := range setText {
|
|
if first {
|
|
// lower bound in a new range
|
|
ranges[i] = singleRange{first: r}
|
|
first = false
|
|
} else {
|
|
ranges[i].last = r - 1
|
|
i++
|
|
first = true
|
|
}
|
|
}
|
|
}
|
|
|
|
return len(ranges)
|
|
}
|
|
|
|
type singleRange struct {
|
|
first rune
|
|
last rune
|
|
}
|