1
0
mirror of https://github.com/golang/go synced 2024-11-18 03:14:44 -07:00

cmd/compile: test constant folded integer to/from float conversions

Improves test coverage of the rules added in CL 63795 and would have
detected the bug fixed by CL 63950.

Change-Id: I107ee8d8e0b6684ce85b2446bd5018c5a03d608a
Reviewed-on: https://go-review.googlesource.com/64130
Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
Michael Munday 2017-09-15 21:50:28 +01:00
parent a07176b45a
commit a5d6b41449

View File

@ -32,8 +32,10 @@ func TestFloatCompare(t *testing.T) {
if !compare2(3, 5) {
t.Errorf("compare2 returned false")
}
}
// test folded float64 comparisons
func TestFloatCompareFolded(t *testing.T) {
// float64 comparisons
d1, d3, d5, d9 := float64(1), float64(3), float64(5), float64(9)
if d3 == d5 {
t.Errorf("d3 == d5 returned true")
@ -81,7 +83,7 @@ func TestFloatCompare(t *testing.T) {
t.Errorf("0 > math.Copysign(0, -1) returned true")
}
// test folded float32 comparisons
// float32 comparisons
s1, s3, s5, s9 := float32(1), float32(3), float32(5), float32(9)
if s3 == s5 {
t.Errorf("s3 == s5 returned true")
@ -249,6 +251,117 @@ func TestFloatConvert(t *testing.T) {
}
}
func TestFloatConvertFolded(t *testing.T) {
// Assign constants to variables so that they are (hopefully) constant folded
// by the SSA backend rather than the frontend.
u64, u32, u16, u8 := uint64(1<<63), uint32(1<<31), uint16(1<<15), uint8(1<<7)
i64, i32, i16, i8 := int64(-1<<63), int32(-1<<31), int16(-1<<15), int8(-1<<7)
du64, du32, du16, du8 := float64(1<<63), float64(1<<31), float64(1<<15), float64(1<<7)
di64, di32, di16, di8 := float64(-1<<63), float64(-1<<31), float64(-1<<15), float64(-1<<7)
su64, su32, su16, su8 := float32(1<<63), float32(1<<31), float32(1<<15), float32(1<<7)
si64, si32, si16, si8 := float32(-1<<63), float32(-1<<31), float32(-1<<15), float32(-1<<7)
// integer to float
if float64(u64) != du64 {
t.Errorf("float64(u64) != du64")
}
if float64(u32) != du32 {
t.Errorf("float64(u32) != du32")
}
if float64(u16) != du16 {
t.Errorf("float64(u16) != du16")
}
if float64(u8) != du8 {
t.Errorf("float64(u8) != du8")
}
if float64(i64) != di64 {
t.Errorf("float64(i64) != di64")
}
if float64(i32) != di32 {
t.Errorf("float64(i32) != di32")
}
if float64(i16) != di16 {
t.Errorf("float64(i16) != di16")
}
if float64(i8) != di8 {
t.Errorf("float64(i8) != di8")
}
if float32(u64) != su64 {
t.Errorf("float32(u64) != su64")
}
if float32(u32) != su32 {
t.Errorf("float32(u32) != su32")
}
if float32(u16) != su16 {
t.Errorf("float32(u16) != su16")
}
if float32(u8) != su8 {
t.Errorf("float32(u8) != su8")
}
if float32(i64) != si64 {
t.Errorf("float32(i64) != si64")
}
if float32(i32) != si32 {
t.Errorf("float32(i32) != si32")
}
if float32(i16) != si16 {
t.Errorf("float32(i16) != si16")
}
if float32(i8) != si8 {
t.Errorf("float32(i8) != si8")
}
// float to integer
if uint64(du64) != u64 {
t.Errorf("uint64(du64) != u64")
}
if uint32(du32) != u32 {
t.Errorf("uint32(du32) != u32")
}
if uint16(du16) != u16 {
t.Errorf("uint16(du16) != u16")
}
if uint8(du8) != u8 {
t.Errorf("uint8(du8) != u8")
}
if int64(di64) != i64 {
t.Errorf("int64(di64) != i64")
}
if int32(di32) != i32 {
t.Errorf("int32(di32) != i32")
}
if int16(di16) != i16 {
t.Errorf("int16(di16) != i16")
}
if int8(di8) != i8 {
t.Errorf("int8(di8) != i8")
}
if uint64(su64) != u64 {
t.Errorf("uint64(su64) != u64")
}
if uint32(su32) != u32 {
t.Errorf("uint32(su32) != u32")
}
if uint16(su16) != u16 {
t.Errorf("uint16(su16) != u16")
}
if uint8(su8) != u8 {
t.Errorf("uint8(su8) != u8")
}
if int64(si64) != i64 {
t.Errorf("int64(si64) != i64")
}
if int32(si32) != i32 {
t.Errorf("int32(si32) != i32")
}
if int16(si16) != i16 {
t.Errorf("int16(si16) != i16")
}
if int8(si8) != i8 {
t.Errorf("int8(si8) != i8")
}
}
var sinkFloat float64
func BenchmarkMul2(b *testing.B) {