]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.regabi] cmd/compile: earlier deadcode removal
authorMatthew Dempsky <mdempsky@google.com>
Fri, 1 Jan 2021 09:32:46 +0000 (01:32 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Fri, 1 Jan 2021 10:52:39 +0000 (10:52 +0000)
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>
src/cmd/compile/internal/gc/main.go

index c1f51e4f1dee36a0d8a99dadf0ddc96dbdd176b6..2ea614e17ff04bf704aea2a8807b34981489d694 100644 (file)
@@ -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.