]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: simplify OpSlicemask optimization
authorAustin Clements <austin@google.com>
Thu, 11 Jan 2018 21:50:09 +0000 (16:50 -0500)
committerAustin Clements <austin@google.com>
Thu, 8 Mar 2018 22:25:29 +0000 (22:25 +0000)
The previous CL introduced isConstDelta. Use it to simplify the
OpSlicemask optimization in the prove pass. This passes toolstash
-cmp.

Change-Id: If2aa762db4cdc0cd1c581a536340530a9831081b
Reviewed-on: https://go-review.googlesource.com/87481
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/ssa/prove.go

index f723ea5e908bb980e52c38309be23bd6c5371df2..d90f0cad33cadccc537ce907074abe77094b5e6a 100644 (file)
@@ -748,19 +748,8 @@ func simplifyBlock(sdom SparseTree, ft *factsTable, b *Block) {
                if v.Op != OpSlicemask {
                        continue
                }
-               add := v.Args[0]
-               if add.Op != OpAdd64 && add.Op != OpAdd32 {
-                       continue
-               }
-               // Note that the arg of slicemask was originally a sub, but
-               // was rewritten to an add by generic.rules (if the thing
-               // being subtracted was a constant).
-               x := add.Args[0]
-               y := add.Args[1]
-               if x.Op == OpConst64 || x.Op == OpConst32 {
-                       x, y = y, x
-               }
-               if y.Op != OpConst64 && y.Op != OpConst32 {
+               x, delta := isConstDelta(v.Args[0])
+               if x == nil {
                        continue
                }
                // slicemask(x + y)
@@ -769,7 +758,7 @@ func simplifyBlock(sdom SparseTree, ft *factsTable, b *Block) {
                if !ok {
                        continue
                }
-               if lim.umin > uint64(-y.AuxInt) {
+               if lim.umin > uint64(-delta) {
                        if v.Args[0].Op == OpAdd64 {
                                v.reset(OpConst64)
                        } else {