Hi, I'm a student interested in working on GCC and want to make a
proposal of GSoC 2014 on GCC Go escape analysis.
I 've read code under /gcc/testsuit/go.* the some source code of
gofrontend, and realization of escape analysis and furthermore
optimization is needed.
Right now I have come up with a small patch of escape test at the
beginning. My patch aims at test for whether escape analysis is
working. Then I want to start some small part of performance function
and write more tests for optimization. Am i on the right direction?
Thanks a lot if anyone can give me some advice.
Ray Li
package main
import(
)
var glob_var = 0
//escape;
func global1(p bool) {
if p == true {
glob_var = 987654321
}
}
//tests for escape as return
//variable v returned as the result of the current function
func escape1() int {
v := 123
return v
}
func escape1b() (int, int) {
x, y := 123, 456
return x, y //both p and q escaped
}
func escape2(p *int) int {
return *p
}
func escape2a(p, q *int) (*int, *int) {
return p, q //escaped
}
func escape2b(p, q *int) (*int, *int) {
return escape2a(p, q) //escaped
}
func escape3(p *int) *int {
q := p
if *p > 0 {
return q //p escaped
} else {
return nil
}
}
//tests for no escape
func noesc1(ptr *int) int {
return *ptr //not escape
}
func noesc2() {
var p int
q := noesc1(&p) //not escape
t := q
_ = t
}
func noesc3() {
var p int
q := escape2(&p) //not escape
_ = q
}
func noesc4() {
var p int
q := escape2(&p) //escape
glob_var = q
}
type T struct {
a, b int
}
func (t *T) foo(x int) (*T, bool) {
t.a = x
t.b = t.a + x
return t, true //escape as return
}
func f() *T {
p, _ := new(T).foo(123)
return p
}
//escape recursively
func escrecursive(p, q int) int {
if p + q > 0 {
return escrecursive(p-1, q-1)
} else {
return p * q //escape as return and also this function become recursively escape
}
}
func main() {
}