
For example, in this code: type kv struct { v float32 } func foo(a *kv) { type kv struct { v byte } } Both 'kv' types would be given the same LLVM type, even though they are different types! This is fixed by only creating a LLVM type once per Go type (types.Type). As an added bonus, this change gives a performance improvement of about 0.4%. Not that much, but certainly not nothing for such a small change.
72 строки
1,1 КиБ
Go
72 строки
1,1 КиБ
Go
package main
|
|
|
|
// Basic tests that don't need to be split into a separate file.
|
|
|
|
func addInt(x, y int) int {
|
|
return x + y
|
|
}
|
|
|
|
func equalInt(x, y int) bool {
|
|
return x == y
|
|
}
|
|
|
|
func floatEQ(x, y float32) bool {
|
|
return x == y
|
|
}
|
|
|
|
func floatNE(x, y float32) bool {
|
|
return x != y
|
|
}
|
|
|
|
func floatLower(x, y float32) bool {
|
|
return x < y
|
|
}
|
|
|
|
func floatLowerEqual(x, y float32) bool {
|
|
return x <= y
|
|
}
|
|
|
|
func floatGreater(x, y float32) bool {
|
|
return x > y
|
|
}
|
|
|
|
func floatGreaterEqual(x, y float32) bool {
|
|
return x >= y
|
|
}
|
|
|
|
func complexReal(x complex64) float32 {
|
|
return real(x)
|
|
}
|
|
|
|
func complexImag(x complex64) float32 {
|
|
return imag(x)
|
|
}
|
|
|
|
func complexAdd(x, y complex64) complex64 {
|
|
return x + y
|
|
}
|
|
|
|
func complexSub(x, y complex64) complex64 {
|
|
return x - y
|
|
}
|
|
|
|
func complexMul(x, y complex64) complex64 {
|
|
return x * y
|
|
}
|
|
|
|
// TODO: complexDiv (requires runtime call)
|
|
|
|
// A type 'kv' also exists in function foo. Test that these two types don't
|
|
// conflict with each other.
|
|
type kv struct {
|
|
v float32
|
|
}
|
|
|
|
func foo(a *kv) {
|
|
// Define a new 'kv' type.
|
|
type kv struct {
|
|
v byte
|
|
}
|
|
// Use this type.
|
|
func(b *kv) {}(nil)
|
|
}
|