]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: insertVarPhis micro-optimization
authorJosh Bleecher Snyder <josharian@gmail.com>
Wed, 16 Nov 2016 06:33:10 +0000 (22:33 -0800)
committerJosh Bleecher Snyder <josharian@gmail.com>
Wed, 1 Feb 2017 20:23:36 +0000 (20:23 +0000)
Algorithmic improvements here are hard.
Lifting a lookup out of the loop helps a little, though.

To compile the code in #17926:

name  old s/op   new s/op   delta
Real   146 ± 3%   140 ± 4%  -3.87%  (p=0.002 n=10+10)
User   143 ± 3%   139 ± 4%  -3.08%  (p=0.005 n=10+10)
Sys   8.28 ±35%  8.08 ±28%    ~     (p=0.684 n=10+10)

Updates #17926.

Change-Id: Ic255ac8b7b409c1a53791058818b7e2cf574abe3
Reviewed-on: https://go-review.googlesource.com/33305
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/gc/phi.go

index 540e144c381068ade63aeb015dcab6cdbaaca593..b6b9ea940d7c15d8fd90fda5e7742a67597c2b6a 100644 (file)
@@ -224,10 +224,11 @@ func (s *phiState) insertVarPhis(n int, var_ *Node, defs []*ssa.Block, typ ssa.T
                                fmt.Printf("  processing %s\n", b)
                        }
 
+                       currentRootLevel := s.level[currentRoot.ID]
                        for _, e := range b.Succs {
                                c := e.Block()
                                // TODO: if the variable is dead at c, skip it.
-                               if s.level[c.ID] > s.level[currentRoot.ID] {
+                               if s.level[c.ID] > currentRootLevel {
                                        // a D-edge, or an edge whose target is in currentRoot's subtree.
                                        continue
                                }