From: Matthew Dempsky Date: Fri, 1 Jan 2021 09:32:46 +0000 (-0800) Subject: [dev.regabi] cmd/compile: earlier deadcode removal X-Git-Tag: go1.17beta1~1539^2~159 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6ddbc75efd4bc2757e7684e7760ee411ec721e15;p=gostls13.git [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 Run-TryBot: Matthew Dempsky TryBot-Result: Go Bot Reviewed-by: Cuong Manh Le --- diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index c1f51e4f1d..2ea614e17f 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -213,6 +213,14 @@ func Main(archInit func(*ssagen.ArchInfo)) { 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. // 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. @@ -224,14 +232,6 @@ func Main(archInit func(*ssagen.ArchInfo)) { } 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. // This needs to run before escape analysis, // because variables captured by value do not escape.