mirror of
https://github.com/golang/go.git
synced 2025-05-08 00:53:07 +00:00
This CL fixes two issues: 1. Load ops were initially always lowered to unsigned loads, even for signed types. This was fine by itself however LoadReg ops (used to re-load spilled values) were lowered to signed loads for signed types. This meant that spills could invalidate optimizations that assumed the original unsigned load. 2. Types were not always being maintained correctly through rules designed to eliminate unnecessary zero and sign extensions. Updates #18906 and fixes #18958 (backport of CL 36256 to 1.8). Change-Id: Id44953b0f644cad047e8474edbd24e8a344ca9a7 Reviewed-on: https://go-review.googlesource.com/36350 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
37 lines
526 B
Go
37 lines
526 B
Go
// run
|
|
|
|
// Copyright 2017 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 main
|
|
|
|
//go:noinline
|
|
func f(x int) {
|
|
}
|
|
|
|
//go:noinline
|
|
func val() int8 {
|
|
return -1
|
|
}
|
|
|
|
var (
|
|
array = [257]int{}
|
|
slice = array[1:]
|
|
)
|
|
|
|
func init() {
|
|
for i := range array {
|
|
array[i] = i - 1
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
x := val()
|
|
y := int(uint8(x))
|
|
f(y) // try and force y to be calculated and spilled
|
|
if slice[y] != 255 {
|
|
panic("incorrect value")
|
|
}
|
|
}
|