]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile: move un-SSAable objects
authorKeith Randall <khr@golang.org>
Sat, 19 Sep 2015 05:58:10 +0000 (22:58 -0700)
committerKeith Randall <khr@golang.org>
Sat, 19 Sep 2015 18:22:46 +0000 (18:22 +0000)
We need to move any objects whose types are not SSA-able.

Fixes the "not lowered: Load ARRAY PTR64 mem" errors.

Change-Id: I7a0b609f917d7fb34bc9215fee4da15f9961cf6c
Reviewed-on: https://go-review.googlesource.com/14753
Reviewed-by: David Chase <drchase@google.com>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/ssa.go
src/cmd/compile/internal/ssa/config.go
src/cmd/compile/internal/ssa/export_test.go
src/cmd/compile/internal/ssa/gen/generic.rules
src/cmd/compile/internal/ssa/rewritegeneric.go

index fb7e0c54ac83bade3b2e21637657979c0f67163e..8e0f0dcc9b891323b3f8ecdbb40eff2154348a78 100644 (file)
@@ -4242,6 +4242,10 @@ func (e *ssaExport) Auto(t ssa.Type) fmt.Stringer {
        return n
 }
 
+func (e ssaExport) CanSSA(t ssa.Type) bool {
+       return canSSAType(t.(*Type))
+}
+
 // Log logs a message from the compiler.
 func (e *ssaExport) Logf(msg string, args ...interface{}) {
        // If e was marked as unimplemented, anything could happen. Ignore.
index 8ae74d0b2f0876e4ddec6d60134f5dc37a5e90ea..c935a2b83eccbda2eadaf20b74cf14f091deb3e4 100644 (file)
@@ -34,6 +34,8 @@ type TypeSource interface {
        TypeUintptr() Type
        TypeString() Type
        TypeBytePtr() Type // TODO: use unsafe.Pointer instead?
+
+       CanSSA(t Type) bool
 }
 
 type Logger interface {
index 7c314c2630d400e35a2f05b86b74d2be6044831c..c0db5c8d9644defb6b78b4fa031453bdc87ee7e7 100644 (file)
@@ -50,3 +50,8 @@ func (d DummyFrontend) TypeInt() Type     { return TypeInt64 }
 func (d DummyFrontend) TypeUintptr() Type { return TypeUInt64 }
 func (d DummyFrontend) TypeString() Type  { panic("unimplemented") }
 func (d DummyFrontend) TypeBytePtr() Type { return TypeBytePtr }
+
+func (d DummyFrontend) CanSSA(t Type) bool {
+       // There are no un-SSAable types in dummy land.
+       return true
+}
index f54496e8a871ab0a9f26e542bc69ef12c9be27f1..8195d6b010373c331ae8425f74b52bae05449a64 100644 (file)
     data
     (Store [config.PtrSize] dst itab mem))
 
-// 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))
+// un-SSAable values use mem->mem copies
+(Store [size] dst (Load <t> src mem) mem) && !config.fe.CanSSA(t) -> (Move [size] dst src mem)
+(Store [size] dst (Load <t> src mem) (VarDef {x} mem)) && !config.fe.CanSSA(t) -> (Move [size] dst src (VarDef {x} mem))
 
 (If (IsNonNil (GetG)) yes no) -> (First nil yes no)
 
index afca4cfed983170eb2a1e041613b13dccd8cae9a..8534e2a865c850f095687dc97aacc413cb889ea3 100644 (file)
@@ -430,7 +430,7 @@ func rewriteValuegeneric(v *Value, config *Config) bool {
        case OpEqInter:
                // match: (EqInter x y)
                // cond:
-               // result: (EqPtr (ITab x) (ITab y))
+               // result: (EqPtr  (ITab x) (ITab y))
                {
                        x := v.Args[0]
                        y := v.Args[1]
@@ -448,8 +448,8 @@ func rewriteValuegeneric(v *Value, config *Config) bool {
                        v.AddArg(v1)
                        return true
                }
-               goto endfcedc545b9bbbe3790786c8981b12d32
-       endfcedc545b9bbbe3790786c8981b12d32:
+               goto end1cc40483caab33ece971ab7e6c8fdfca
+       end1cc40483caab33ece971ab7e6c8fdfca:
                ;
        case OpEqPtr:
                // match: (EqPtr p (ConstNil))
@@ -497,7 +497,7 @@ func rewriteValuegeneric(v *Value, config *Config) bool {
        case OpEqSlice:
                // match: (EqSlice x y)
                // cond:
-               // result: (EqPtr (SlicePtr x) (SlicePtr y))
+               // result: (EqPtr  (SlicePtr x) (SlicePtr y))
                {
                        x := v.Args[0]
                        y := v.Args[1]
@@ -515,8 +515,8 @@ func rewriteValuegeneric(v *Value, config *Config) bool {
                        v.AddArg(v1)
                        return true
                }
-               goto end2937092dca53f896cd527e59e92cab1d
-       end2937092dca53f896cd527e59e92cab1d:
+               goto end9cd53ca57ee90aa09c54f8071c8e8769
+       end9cd53ca57ee90aa09c54f8071c8e8769:
                ;
        case OpIData:
                // match: (IData (IMake _ data))
@@ -1398,22 +1398,23 @@ func rewriteValuegeneric(v *Value, config *Config) bool {
                goto endaa801a871178ae3256b3f6f5d9f13514
        endaa801a871178ae3256b3f6f5d9f13514:
                ;
-               // match: (Store [size] dst (Load src mem) mem)
-               // cond: size > config.IntSize
+               // match: (Store [size] dst (Load <t> src mem) mem)
+               // cond: !config.fe.CanSSA(t)
                // result: (Move [size] dst src mem)
                {
                        size := v.AuxInt
                        dst := v.Args[0]
                        if v.Args[1].Op != OpLoad {
-                               goto enda18a7163888e2f4fca9f38bae56cef42
+                               goto end45295326269ba18413dceb7b608a0b9d
                        }
+                       t := v.Args[1].Type
                        src := v.Args[1].Args[0]
                        mem := v.Args[1].Args[1]
                        if v.Args[2] != mem {
-                               goto enda18a7163888e2f4fca9f38bae56cef42
+                               goto end45295326269ba18413dceb7b608a0b9d
                        }
-                       if !(size > config.IntSize) {
-                               goto enda18a7163888e2f4fca9f38bae56cef42
+                       if !(!config.fe.CanSSA(t)) {
+                               goto end45295326269ba18413dceb7b608a0b9d
                        }
                        v.Op = OpMove
                        v.AuxInt = 0
@@ -1425,29 +1426,30 @@ func rewriteValuegeneric(v *Value, config *Config) bool {
                        v.AddArg(mem)
                        return true
                }
-               goto enda18a7163888e2f4fca9f38bae56cef42
-       enda18a7163888e2f4fca9f38bae56cef42:
+               goto end45295326269ba18413dceb7b608a0b9d
+       end45295326269ba18413dceb7b608a0b9d:
                ;
-               // match: (Store [size] dst (Load src mem) (VarDef {x} mem))
-               // cond: size > config.IntSize
+               // match: (Store [size] dst (Load <t> src mem) (VarDef {x} mem))
+               // cond: !config.fe.CanSSA(t)
                // result: (Move [size] dst src (VarDef {x} mem))
                {
                        size := v.AuxInt
                        dst := v.Args[0]
                        if v.Args[1].Op != OpLoad {
-                               goto endc671c9b1be99e3125fe81e29018bc0e6
+                               goto end7f3cc0baffb82ba3ee879599b189a512
                        }
+                       t := v.Args[1].Type
                        src := v.Args[1].Args[0]
                        mem := v.Args[1].Args[1]
                        if v.Args[2].Op != OpVarDef {
-                               goto endc671c9b1be99e3125fe81e29018bc0e6
+                               goto end7f3cc0baffb82ba3ee879599b189a512
                        }
                        x := v.Args[2].Aux
                        if v.Args[2].Args[0] != mem {
-                               goto endc671c9b1be99e3125fe81e29018bc0e6
+                               goto end7f3cc0baffb82ba3ee879599b189a512
                        }
-                       if !(size > config.IntSize) {
-                               goto endc671c9b1be99e3125fe81e29018bc0e6
+                       if !(!config.fe.CanSSA(t)) {
+                               goto end7f3cc0baffb82ba3ee879599b189a512
                        }
                        v.Op = OpMove
                        v.AuxInt = 0
@@ -1463,8 +1465,8 @@ func rewriteValuegeneric(v *Value, config *Config) bool {
                        v.AddArg(v0)
                        return true
                }
-               goto endc671c9b1be99e3125fe81e29018bc0e6
-       endc671c9b1be99e3125fe81e29018bc0e6:
+               goto end7f3cc0baffb82ba3ee879599b189a512
+       end7f3cc0baffb82ba3ee879599b189a512:
                ;
        case OpStringLen:
                // match: (StringLen (StringMake _ len))