]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/cmd/compile/internal/ssa/rewriteAMD64.go
cmd/compile: memcombine if values being stored are from consecutive loads
[gostls13.git] / src / cmd / compile / internal / ssa / rewriteAMD64.go
index 88bd48f331157bf7ff6932d71a2a41baf7553ea8..2d4a886ea5bd6dbec53514e73ef089f8c7852eb6 100644 (file)
@@ -10181,8 +10181,6 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool {
        v_2 := v.Args[2]
        v_1 := v.Args[1]
        v_0 := v.Args[0]
-       b := v.Block
-       typ := &b.Func.Config.Types
        // match: (MOVBstore [off] {sym} ptr y:(SETL x) mem)
        // cond: y.Uses == 1
        // result: (SETLstore [off] {sym} ptr x mem)
@@ -10516,47 +10514,6 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool {
                v.AddArg3(base, val, mem)
                return true
        }
-       // match: (MOVBstore [i] {s} p x1:(MOVBload [j] {s2} p2 mem) mem2:(MOVBstore [i-1] {s} p x2:(MOVBload [j-1] {s2} p2 mem) mem))
-       // cond: x1.Uses == 1 && x2.Uses == 1 && mem2.Uses == 1 && clobber(x1, x2, mem2)
-       // result: (MOVWstore [i-1] {s} p (MOVWload [j-1] {s2} p2 mem) mem)
-       for {
-               i := auxIntToInt32(v.AuxInt)
-               s := auxToSym(v.Aux)
-               p := v_0
-               x1 := v_1
-               if x1.Op != OpAMD64MOVBload {
-                       break
-               }
-               j := auxIntToInt32(x1.AuxInt)
-               s2 := auxToSym(x1.Aux)
-               mem := x1.Args[1]
-               p2 := x1.Args[0]
-               mem2 := v_2
-               if mem2.Op != OpAMD64MOVBstore || auxIntToInt32(mem2.AuxInt) != i-1 || auxToSym(mem2.Aux) != s {
-                       break
-               }
-               _ = mem2.Args[2]
-               if p != mem2.Args[0] {
-                       break
-               }
-               x2 := mem2.Args[1]
-               if x2.Op != OpAMD64MOVBload || auxIntToInt32(x2.AuxInt) != j-1 || auxToSym(x2.Aux) != s2 {
-                       break
-               }
-               _ = x2.Args[1]
-               if p2 != x2.Args[0] || mem != x2.Args[1] || mem != mem2.Args[2] || !(x1.Uses == 1 && x2.Uses == 1 && mem2.Uses == 1 && clobber(x1, x2, mem2)) {
-                       break
-               }
-               v.reset(OpAMD64MOVWstore)
-               v.AuxInt = int32ToAuxInt(i - 1)
-               v.Aux = symToAux(s)
-               v0 := b.NewValue0(x2.Pos, OpAMD64MOVWload, typ.UInt16)
-               v0.AuxInt = int32ToAuxInt(j - 1)
-               v0.Aux = symToAux(s2)
-               v0.AddArg2(p2, mem)
-               v.AddArg3(p, v0, mem)
-               return true
-       }
        return false
 }
 func rewriteValueAMD64_OpAMD64MOVBstoreconst(v *Value) bool {
@@ -11069,8 +11026,6 @@ func rewriteValueAMD64_OpAMD64MOVLstore(v *Value) bool {
        v_2 := v.Args[2]
        v_1 := v.Args[1]
        v_0 := v.Args[0]
-       b := v.Block
-       typ := &b.Func.Config.Types
        // match: (MOVLstore [off] {sym} ptr (MOVLQSX x) mem)
        // result: (MOVLstore [off] {sym} ptr x mem)
        for {
@@ -11184,47 +11139,6 @@ func rewriteValueAMD64_OpAMD64MOVLstore(v *Value) bool {
                v.AddArg3(base, val, mem)
                return true
        }
-       // match: (MOVLstore [i] {s} p x1:(MOVLload [j] {s2} p2 mem) mem2:(MOVLstore [i-4] {s} p x2:(MOVLload [j-4] {s2} p2 mem) mem))
-       // cond: x1.Uses == 1 && x2.Uses == 1 && mem2.Uses == 1 && clobber(x1, x2, mem2)
-       // result: (MOVQstore [i-4] {s} p (MOVQload [j-4] {s2} p2 mem) mem)
-       for {
-               i := auxIntToInt32(v.AuxInt)
-               s := auxToSym(v.Aux)
-               p := v_0
-               x1 := v_1
-               if x1.Op != OpAMD64MOVLload {
-                       break
-               }
-               j := auxIntToInt32(x1.AuxInt)
-               s2 := auxToSym(x1.Aux)
-               mem := x1.Args[1]
-               p2 := x1.Args[0]
-               mem2 := v_2
-               if mem2.Op != OpAMD64MOVLstore || auxIntToInt32(mem2.AuxInt) != i-4 || auxToSym(mem2.Aux) != s {
-                       break
-               }
-               _ = mem2.Args[2]
-               if p != mem2.Args[0] {
-                       break
-               }
-               x2 := mem2.Args[1]
-               if x2.Op != OpAMD64MOVLload || auxIntToInt32(x2.AuxInt) != j-4 || auxToSym(x2.Aux) != s2 {
-                       break
-               }
-               _ = x2.Args[1]
-               if p2 != x2.Args[0] || mem != x2.Args[1] || mem != mem2.Args[2] || !(x1.Uses == 1 && x2.Uses == 1 && mem2.Uses == 1 && clobber(x1, x2, mem2)) {
-                       break
-               }
-               v.reset(OpAMD64MOVQstore)
-               v.AuxInt = int32ToAuxInt(i - 4)
-               v.Aux = symToAux(s)
-               v0 := b.NewValue0(x2.Pos, OpAMD64MOVQload, typ.UInt64)
-               v0.AuxInt = int32ToAuxInt(j - 4)
-               v0.Aux = symToAux(s2)
-               v0.AddArg2(p2, mem)
-               v.AddArg3(p, v0, mem)
-               return true
-       }
        // match: (MOVLstore {sym} [off] ptr y:(ADDLload x [off] {sym} ptr mem) mem)
        // cond: y.Uses==1 && clobber(y)
        // result: (ADDLmodify [off] {sym} ptr x mem)
@@ -13270,8 +13184,6 @@ func rewriteValueAMD64_OpAMD64MOVWstore(v *Value) bool {
        v_2 := v.Args[2]
        v_1 := v.Args[1]
        v_0 := v.Args[0]
-       b := v.Block
-       typ := &b.Func.Config.Types
        // match: (MOVWstore [off] {sym} ptr (MOVWQSX x) mem)
        // result: (MOVWstore [off] {sym} ptr x mem)
        for {
@@ -13385,47 +13297,6 @@ func rewriteValueAMD64_OpAMD64MOVWstore(v *Value) bool {
                v.AddArg3(base, val, mem)
                return true
        }
-       // match: (MOVWstore [i] {s} p x1:(MOVWload [j] {s2} p2 mem) mem2:(MOVWstore [i-2] {s} p x2:(MOVWload [j-2] {s2} p2 mem) mem))
-       // cond: x1.Uses == 1 && x2.Uses == 1 && mem2.Uses == 1 && clobber(x1, x2, mem2)
-       // result: (MOVLstore [i-2] {s} p (MOVLload [j-2] {s2} p2 mem) mem)
-       for {
-               i := auxIntToInt32(v.AuxInt)
-               s := auxToSym(v.Aux)
-               p := v_0
-               x1 := v_1
-               if x1.Op != OpAMD64MOVWload {
-                       break
-               }
-               j := auxIntToInt32(x1.AuxInt)
-               s2 := auxToSym(x1.Aux)
-               mem := x1.Args[1]
-               p2 := x1.Args[0]
-               mem2 := v_2
-               if mem2.Op != OpAMD64MOVWstore || auxIntToInt32(mem2.AuxInt) != i-2 || auxToSym(mem2.Aux) != s {
-                       break
-               }
-               _ = mem2.Args[2]
-               if p != mem2.Args[0] {
-                       break
-               }
-               x2 := mem2.Args[1]
-               if x2.Op != OpAMD64MOVWload || auxIntToInt32(x2.AuxInt) != j-2 || auxToSym(x2.Aux) != s2 {
-                       break
-               }
-               _ = x2.Args[1]
-               if p2 != x2.Args[0] || mem != x2.Args[1] || mem != mem2.Args[2] || !(x1.Uses == 1 && x2.Uses == 1 && mem2.Uses == 1 && clobber(x1, x2, mem2)) {
-                       break
-               }
-               v.reset(OpAMD64MOVLstore)
-               v.AuxInt = int32ToAuxInt(i - 2)
-               v.Aux = symToAux(s)
-               v0 := b.NewValue0(x2.Pos, OpAMD64MOVLload, typ.UInt32)
-               v0.AuxInt = int32ToAuxInt(j - 2)
-               v0.Aux = symToAux(s2)
-               v0.AddArg2(p2, mem)
-               v.AddArg3(p, v0, mem)
-               return true
-       }
        // match: (MOVWstore [i] {s} p x:(ROLWconst [8] w) mem)
        // cond: x.Uses == 1 && buildcfg.GOAMD64 >= 3
        // result: (MOVBEWstore [i] {s} p w mem)