From 6ddbc75efd4bc2757e7684e7760ee411ec721e15 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Fri, 1 Jan 2021 01:32:46 -0800 Subject: [PATCH] [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 --- src/cmd/compile/internal/gc/main.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) 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.