From 37590bddc417c2675f4979a9467edc1961f88b61 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Fri, 18 Sep 2015 22:58:10 -0700 Subject: [PATCH] [dev.ssa] cmd/compile: move un-SSAable objects 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 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/ssa.go | 4 ++ src/cmd/compile/internal/ssa/config.go | 2 + src/cmd/compile/internal/ssa/export_test.go | 5 ++ .../compile/internal/ssa/gen/generic.rules | 6 +-- .../compile/internal/ssa/rewritegeneric.go | 48 ++++++++++--------- 5 files changed, 39 insertions(+), 26 deletions(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index fb7e0c54ac..8e0f0dcc9b 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -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. diff --git a/src/cmd/compile/internal/ssa/config.go b/src/cmd/compile/internal/ssa/config.go index 8ae74d0b2f..c935a2b83e 100644 --- a/src/cmd/compile/internal/ssa/config.go +++ b/src/cmd/compile/internal/ssa/config.go @@ -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 { diff --git a/src/cmd/compile/internal/ssa/export_test.go b/src/cmd/compile/internal/ssa/export_test.go index 7c314c2630..c0db5c8d96 100644 --- a/src/cmd/compile/internal/ssa/export_test.go +++ b/src/cmd/compile/internal/ssa/export_test.go @@ -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 +} diff --git a/src/cmd/compile/internal/ssa/gen/generic.rules b/src/cmd/compile/internal/ssa/gen/generic.rules index f54496e8a8..8195d6b010 100644 --- a/src/cmd/compile/internal/ssa/gen/generic.rules +++ b/src/cmd/compile/internal/ssa/gen/generic.rules @@ -176,9 +176,9 @@ 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 src mem) mem) && !config.fe.CanSSA(t) -> (Move [size] dst src mem) +(Store [size] dst (Load 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) diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index afca4cfed9..8534e2a865 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -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 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 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))