]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile/internal/ssa: large object load/store vs. vardef
authorKeith Randall <khr@golang.org>
Mon, 7 Sep 2015 20:55:49 +0000 (13:55 -0700)
committerKeith Randall <khr@golang.org>
Mon, 7 Sep 2015 21:05:22 +0000 (21:05 +0000)
VarDef declarations are getting in the way of rewriting load/store
pairs into moves.  This change fixes that, albeit in a really hacky way.
Better options would be appreciated.

Increases coverage during make.bash from 67% to 71%.

Change-Id: I336e967687e2238c7d0d64e3b37132a731ad15c3
Reviewed-on: https://go-review.googlesource.com/14347
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
src/cmd/compile/internal/ssa/gen/generic.rules
src/cmd/compile/internal/ssa/gen/genericOps.go
src/cmd/compile/internal/ssa/rewritegeneric.go

index d2ab9f5421e5e92d8b6e7a75fec1edcbca5eb175..b704014287f0fde69f2f6848231c490c3989aa8a 100644 (file)
 
 // big-object moves (TODO: remove?)
 (Store [size] dst (Load src mem) mem) && size > config.IntSize -> (Move [size] dst src mem)
+(Store [size] dst (Load src mem) (VarDef {x} mem)) && size > config.IntSize -> (Move [size] dst src (VarDef {x} mem))
 
 (If (IsNonNil (GetG)) yes no) -> (First nil yes no)
 
index b52bd1fecc7751676d75cfec23cf08f2836771cc..042d34ea85c3b66e356835ac4ea78f86c615f6ba 100644 (file)
@@ -362,8 +362,8 @@ var genericOps = []opData{
        // Used during ssa construction.  Like Copy, but the arg has not been specified yet.
        {name: "FwdRef"},
 
-       {name: "VarDef"},  // aux is a *gc.Node of a variable that is about to be initialized.  arg0=mem, returns mem
-       {name: "VarKill"}, // aux is a *gc.Node of a variable that is known to be dead.  arg0=mem, returns mem
+       {name: "VarDef", typ: "Mem"}, // aux is a *gc.Node of a variable that is about to be initialized.  arg0=mem, returns mem
+       {name: "VarKill"},            // aux is a *gc.Node of a variable that is known to be dead.  arg0=mem, returns mem
 }
 
 //     kind           control    successors
index dc6604fe3804360aa387283a10bc1808f41e97c3..0334c0cd95bd11af0c2d79bf75b4d6367744e363 100644 (file)
@@ -1434,6 +1434,44 @@ func rewriteValuegeneric(v *Value, config *Config) bool {
                goto enda18a7163888e2f4fca9f38bae56cef42
        enda18a7163888e2f4fca9f38bae56cef42:
                ;
+               // match: (Store [size] dst (Load src mem) (VarDef {x} mem))
+               // cond: size > config.IntSize
+               // result: (Move [size] dst src (VarDef {x} mem))
+               {
+                       size := v.AuxInt
+                       dst := v.Args[0]
+                       if v.Args[1].Op != OpLoad {
+                               goto endc671c9b1be99e3125fe81e29018bc0e6
+                       }
+                       src := v.Args[1].Args[0]
+                       mem := v.Args[1].Args[1]
+                       if v.Args[2].Op != OpVarDef {
+                               goto endc671c9b1be99e3125fe81e29018bc0e6
+                       }
+                       x := v.Args[2].Aux
+                       if v.Args[2].Args[0] != mem {
+                               goto endc671c9b1be99e3125fe81e29018bc0e6
+                       }
+                       if !(size > config.IntSize) {
+                               goto endc671c9b1be99e3125fe81e29018bc0e6
+                       }
+                       v.Op = OpMove
+                       v.AuxInt = 0
+                       v.Aux = nil
+                       v.resetArgs()
+                       v.AuxInt = size
+                       v.AddArg(dst)
+                       v.AddArg(src)
+                       v0 := b.NewValue0(v.Line, OpVarDef, TypeInvalid)
+                       v0.Aux = x
+                       v0.AddArg(mem)
+                       v0.Type = TypeMem
+                       v.AddArg(v0)
+                       return true
+               }
+               goto endc671c9b1be99e3125fe81e29018bc0e6
+       endc671c9b1be99e3125fe81e29018bc0e6:
+               ;
        case OpStringLen:
                // match: (StringLen (StringMake _ len))
                // cond: