diff options
| author | Josh Bleecher Snyder <josharian@gmail.com> | 2015-06-02 09:16:22 -0700 |
|---|---|---|
| committer | Josh Bleecher Snyder <josharian@gmail.com> | 2015-06-04 23:13:45 +0000 |
| commit | e00d60901a225b2b08bb52126704cb3422a569f4 (patch) | |
| tree | 55d8dc8cb2ebafdac86ab5452c183cea672116dd /src | |
| parent | 8d32360bddaafb4e8eafe0e57065b4883b4ec55f (diff) | |
| download | go-e00d60901a225b2b08bb52126704cb3422a569f4.tar.xz | |
[dev.ssa] cmd/compile/internal/ssa: minor fixes
* Improve some docs and logging.
* Set correct type and len for indexing into strings.
Fixes #11029.
Change-Id: Ib22c45908e41ba3752010d2f5759e37e3921a48e
Reviewed-on: https://go-review.googlesource.com/10635
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/compile/internal/gc/ssa.go | 19 | ||||
| -rw-r--r-- | src/cmd/compile/internal/ssa/deadcode.go | 2 | ||||
| -rw-r--r-- | src/cmd/compile/internal/ssa/rewrite.go | 4 |
3 files changed, 17 insertions, 8 deletions
diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 3c95266bdc..fd1c30edee 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -327,11 +327,20 @@ func (s *state) expr(n *Node) *ssa.Value { return s.curBlock.NewValue2(ssa.OpLoad, n.Type, nil, p, s.mem()) case OINDEX: - if n.Left.Type.Bound >= 0 { // array + if n.Left.Type.Bound >= 0 { // array or string a := s.expr(n.Left) i := s.expr(n.Right) - s.boundsCheck(i, s.f.ConstInt(s.config.Uintptr, n.Left.Type.Bound)) - return s.curBlock.NewValue2(ssa.OpArrayIndex, n.Left.Type.Type, nil, a, i) + var elemtype *Type + var len *ssa.Value + if n.Left.Type.IsString() { + len = s.curBlock.NewValue1(ssa.OpStringLen, s.config.Uintptr, nil, a) + elemtype = Types[TUINT8] + } else { + len = s.f.ConstInt(s.config.Uintptr, n.Left.Type.Bound) + elemtype = n.Left.Type.Type + } + s.boundsCheck(i, len) + return s.curBlock.NewValue2(ssa.OpArrayIndex, elemtype, nil, a, i) } else { // slice p := s.addr(n) return s.curBlock.NewValue2(ssa.OpLoad, n.Left.Type.Type, nil, p, s.mem()) @@ -367,7 +376,7 @@ func (s *state) expr(n *Node) *ssa.Value { } } -// expr converts the address of the expression n to SSA, adds it to s and returns the SSA result. +// addr converts the address of the expression n to SSA, adds it to s and returns the SSA result. func (s *state) addr(n *Node) *ssa.Value { switch n.Op { case ONAME: @@ -402,7 +411,7 @@ func (s *state) addr(n *Node) *ssa.Value { return s.curBlock.NewValue2(ssa.OpPtrIndex, Ptrto(n.Left.Type.Type), nil, p, i) } default: - log.Fatalf("addr: bad op %v", n.Op) + log.Fatalf("addr: bad op %v", Oconv(int(n.Op), 0)) return nil } } diff --git a/src/cmd/compile/internal/ssa/deadcode.go b/src/cmd/compile/internal/ssa/deadcode.go index ba5d8758d9..1a5589cd0a 100644 --- a/src/cmd/compile/internal/ssa/deadcode.go +++ b/src/cmd/compile/internal/ssa/deadcode.go @@ -82,7 +82,7 @@ func deadcode(f *Func) { i++ } else { if len(b.Values) > 0 { - panic("live value in unreachable block") + log.Panicf("live values in unreachable block %v: %v", b, b.Values) } f.bid.put(b.ID) } diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index 6b76e55e2a..fd0fc7e1a7 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -12,10 +12,10 @@ func applyRewrite(f *Func, rb func(*Block) bool, rv func(*Value, *Config) bool) var curv *Value defer func() { if curb != nil { - log.Printf("panic during rewrite of %s\n", curb.LongString()) + log.Printf("panic during rewrite of block %s\n", curb.LongString()) } if curv != nil { - log.Printf("panic during rewrite of %s\n", curv.LongString()) + log.Printf("panic during rewrite of value %s\n", curv.LongString()) panic("rewrite failed") // TODO(khr): print source location also } |
