mirror of
https://github.com/golang/go
synced 2024-11-13 13:40:22 -07:00
[dev.regabi] cmd/compile: earlier deadcode removal
This CL moves the general deadcode-removal pass to before computing Addrtaken, which allows variables to still be converted to SSA if their address is only taken in unreachable code paths (e.g., the "&mp" expression in the "if false" block in runtime/os_linux.go:newosproc). This doesn't pass toolstash -cmp, because it allows SSA to better optimize some code. Change-Id: I43e54acc02fdcbad8eb6493283f355aa1ee0de84 Reviewed-on: https://go-review.googlesource.com/c/go/+/280992 Trust: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
This commit is contained in:
parent
68e6fa4f68
commit
6ddbc75efd
@ -213,6 +213,14 @@ func Main(archInit func(*ssagen.ArchInfo)) {
|
|||||||
typecheck.Export(initTask)
|
typecheck.Export(initTask)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Eliminate some obviously dead code.
|
||||||
|
// Must happen after typechecking.
|
||||||
|
for _, n := range typecheck.Target.Decls {
|
||||||
|
if n.Op() == ir.ODCLFUNC {
|
||||||
|
deadcode.Func(n.(*ir.Func))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Compute Addrtaken for names.
|
// Compute Addrtaken for names.
|
||||||
// We need to wait until typechecking is done so that when we see &x[i]
|
// We need to wait until typechecking is done so that when we see &x[i]
|
||||||
// we know that x has its address taken if x is an array, but not if x is a slice.
|
// we know that x has its address taken if x is an array, but not if x is a slice.
|
||||||
@ -224,14 +232,6 @@ func Main(archInit func(*ssagen.ArchInfo)) {
|
|||||||
}
|
}
|
||||||
typecheck.IncrementalAddrtaken = true
|
typecheck.IncrementalAddrtaken = true
|
||||||
|
|
||||||
// Eliminate some obviously dead code.
|
|
||||||
// Must happen after typechecking.
|
|
||||||
for _, n := range typecheck.Target.Decls {
|
|
||||||
if n.Op() == ir.ODCLFUNC {
|
|
||||||
deadcode.Func(n.(*ir.Func))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decide how to capture closed variables.
|
// Decide how to capture closed variables.
|
||||||
// This needs to run before escape analysis,
|
// This needs to run before escape analysis,
|
||||||
// because variables captured by value do not escape.
|
// because variables captured by value do not escape.
|
||||||
|
Loading…
Reference in New Issue
Block a user