diff options
author | Alexandru Moșoi <mosoi@google.com> | 2016-03-03 11:13:43 +0100 |
---|---|---|
committer | Alexandru Moșoi <alexandru@mosoi.ro> | 2016-03-09 11:08:59 +0000 |
commit | dfcb853d9d75116e939b31fa12316fc3e8494845 (patch) | |
tree | 5f3923df7602ebc1c0687d0b75dfdd424efba550 /src/cmd/compile/internal/ssa/rewritedec.go | |
parent | aa3650f01976524ad80b2aad987e2d4f655cbe65 (diff) | |
download | go-dfcb853d9d75116e939b31fa12316fc3e8494845.tar.gz go-dfcb853d9d75116e939b31fa12316fc3e8494845.zip |
cmd/compile/internal/ssa: lower builtins much later
* Move lowering into a separate pass.
* SliceLen/SliceCap is now available to various intermediate passes
which use useful for bounds checking.
* Add a second opt pass to handle the new opportunities
Decreases the code size of binaries in pkg/tool/linux_amd64
by ~45K.
Updates #14564 #14606
Change-Id: I5b2bd6202181c50623a3585fbf15c0d6db6d4685
Reviewed-on: https://go-review.googlesource.com/20172
Run-TryBot: Alexandru Moșoi <alexandru@mosoi.ro>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'src/cmd/compile/internal/ssa/rewritedec.go')
-rw-r--r-- | src/cmd/compile/internal/ssa/rewritedec.go | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/rewritedec.go b/src/cmd/compile/internal/ssa/rewritedec.go new file mode 100644 index 0000000000..e62c789368 --- /dev/null +++ b/src/cmd/compile/internal/ssa/rewritedec.go @@ -0,0 +1,118 @@ +// autogenerated from gen/dec.rules: do not edit! +// generated with: cd gen; go run *.go + +package ssa + +import "math" + +var _ = math.MinInt8 // in case not otherwise used +func rewriteValuedec(v *Value, config *Config) bool { + switch v.Op { + case OpSliceCap: + return rewriteValuedec_OpSliceCap(v, config) + case OpSliceLen: + return rewriteValuedec_OpSliceLen(v, config) + case OpSlicePtr: + return rewriteValuedec_OpSlicePtr(v, config) + case OpStringLen: + return rewriteValuedec_OpStringLen(v, config) + case OpStringPtr: + return rewriteValuedec_OpStringPtr(v, config) + } + return false +} +func rewriteValuedec_OpSliceCap(v *Value, config *Config) bool { + b := v.Block + _ = b + // match: (SliceCap (SliceMake _ _ cap)) + // cond: + // result: cap + for { + if v.Args[0].Op != OpSliceMake { + break + } + cap := v.Args[0].Args[2] + v.reset(OpCopy) + v.Type = cap.Type + v.AddArg(cap) + return true + } + return false +} +func rewriteValuedec_OpSliceLen(v *Value, config *Config) bool { + b := v.Block + _ = b + // match: (SliceLen (SliceMake _ len _)) + // cond: + // result: len + for { + if v.Args[0].Op != OpSliceMake { + break + } + len := v.Args[0].Args[1] + v.reset(OpCopy) + v.Type = len.Type + v.AddArg(len) + return true + } + return false +} +func rewriteValuedec_OpSlicePtr(v *Value, config *Config) bool { + b := v.Block + _ = b + // match: (SlicePtr (SliceMake ptr _ _ )) + // cond: + // result: ptr + for { + if v.Args[0].Op != OpSliceMake { + break + } + ptr := v.Args[0].Args[0] + v.reset(OpCopy) + v.Type = ptr.Type + v.AddArg(ptr) + return true + } + return false +} +func rewriteValuedec_OpStringLen(v *Value, config *Config) bool { + b := v.Block + _ = b + // match: (StringLen (StringMake _ len)) + // cond: + // result: len + for { + if v.Args[0].Op != OpStringMake { + break + } + len := v.Args[0].Args[1] + v.reset(OpCopy) + v.Type = len.Type + v.AddArg(len) + return true + } + return false +} +func rewriteValuedec_OpStringPtr(v *Value, config *Config) bool { + b := v.Block + _ = b + // match: (StringPtr (StringMake ptr _)) + // cond: + // result: ptr + for { + if v.Args[0].Op != OpStringMake { + break + } + ptr := v.Args[0].Args[0] + v.reset(OpCopy) + v.Type = ptr.Type + v.AddArg(ptr) + return true + } + return false +} +func rewriteBlockdec(b *Block) bool { + switch b.Kind { + } + return false +} |