gc: fix order of evaluation

Pulling function calls out to happen before the
expression being evaluated was causing illegal
reorderings even without inlining; with inlining
it got worse.  This CL adds a separate ordering pass
to move things with a fixed order out of expressions
and into the statement sequence, where they will
not be reordered by walk.

Replaces lvd's CL 5534079.

Fixes #2740.

R=lvd
CC=golang-dev
https://golang.org/cl/5569062
This commit is contained in:
Russ Cox 2012-01-25 17:53:50 -05:00
parent 73ce14d0aa
commit ee9bfb023a
14 changed files with 705 additions and 46 deletions

View file

@ -1,29 +1,46 @@
// $G $D/$F.go || echo "Bug398"
// $G $D/$F.go && $L $F.$A && ./$A.out || echo "Bug401"
// Copyright 2011 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.
// Issue 2582
package foo
type T struct {}
package main
type T struct{}
func (T) cplx() complex128 {
for false {} // avoid inlining
return complex(1,0)
for false {
} // avoid inlining
return complex(1, 0)
}
func (T) cplx2() complex128 {
return complex(0, 1)
}
type I interface {
cplx() complex128
}
func f(e float32, t T) {
func main() {
_ = real(t.cplx())
_ = imag(t.cplx())
var t T
if v := real(t.cplx()); v != 1 {
panic("not-inlined complex call failed")
}
_ = imag(t.cplx())
_ = real(t.cplx2())
if v := imag(t.cplx2()); v != 1 {
panic("potentially inlined complex call failed")
}
var i I
i = t
_ = real(i.cplx())
_ = imag(i.cplx())
}
if v := real(i.cplx()); v != 1 {
panic("potentially inlined complex call failed")
}
_ = imag(i.cplx())
}