mirror of
https://github.com/golang/go
synced 2024-11-06 00:26:11 -07:00
58cdecb9c8
If both inputs are constant offsets from the same pointer then we can evaluate NeqPtr and EqPtr at compile time. Triggers a few times during all.bash. Removes a conditional branch in the following code: copy(x[1:], x[:]) This branch was recently added as an optimization in CL 94596. We now skip the memmove if the pointers are equal. However, in the above code we know at compile time that they are never equal. Also, when the offset is variable, check if the offset is zero rather than if the pointers are equal. For example: copy(x[a:], x[:]) This would now skip the copy if a == 0, rather than if x + a == x. Finally I've also added a rule to make IsNonNil true for pointers to values on the stack. The nil check elimination pass will catch these anyway, but eliminating them here might eliminate branches earlier. Change-Id: If72f436fef0a96ad0f4e296d3a1f8b6c3e712085 Reviewed-on: https://go-review.googlesource.com/106635 Run-TryBot: Michael Munday <mike.munday@ibm.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
58 lines
1.1 KiB
Go
58 lines
1.1 KiB
Go
// asmcheck
|
|
|
|
// Copyright 2018 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 codegen
|
|
|
|
// Check small copies are replaced with moves.
|
|
|
|
func movesmall4() {
|
|
x := [...]byte{1, 2, 3, 4}
|
|
// 386:-".*memmove"
|
|
// amd64:-".*memmove"
|
|
// arm:-".*memmove"
|
|
// arm64:-".*memmove"
|
|
copy(x[1:], x[:])
|
|
}
|
|
|
|
func movesmall7() {
|
|
x := [...]byte{1, 2, 3, 4, 5, 6, 7}
|
|
// 386:-".*memmove"
|
|
// amd64:-".*memmove"
|
|
// arm64:-".*memmove"
|
|
copy(x[1:], x[:])
|
|
}
|
|
|
|
func movesmall16() {
|
|
x := [...]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
|
|
// amd64:-".*memmove"
|
|
copy(x[1:], x[:])
|
|
}
|
|
|
|
// Check that no branches are generated when the pointers are [not] equal.
|
|
|
|
var x [256]byte
|
|
|
|
func ptrEqual() {
|
|
// amd64:-"JEQ",-"JNE"
|
|
// ppc64le:-"BEQ",-"BNE"
|
|
// s390x:-"BEQ",-"BNE"
|
|
copy(x[:], x[:])
|
|
}
|
|
|
|
func ptrOneOffset() {
|
|
// amd64:-"JEQ",-"JNE"
|
|
// ppc64le:-"BEQ",-"BNE"
|
|
// s390x:-"BEQ",-"BNE"
|
|
copy(x[1:], x[:])
|
|
}
|
|
|
|
func ptrBothOffset() {
|
|
// amd64:-"JEQ",-"JNE"
|
|
// ppc64le:-"BEQ",-"BNE"
|
|
// s390x:-"BEQ",-"BNE"
|
|
copy(x[1:], x[2:])
|
|
}
|