]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile/internal/ssa: minor fixes
authorJosh Bleecher Snyder <josharian@gmail.com>
Tue, 2 Jun 2015 16:16:22 +0000 (09:16 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Thu, 4 Jun 2015 23:13:45 +0000 (23:13 +0000)
* 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>
src/cmd/compile/internal/gc/ssa.go
src/cmd/compile/internal/ssa/deadcode.go
src/cmd/compile/internal/ssa/rewrite.go

index 3c95266bdcc96cde6458cbe0d319487585f968bb..fd1c30edee355dd1b64d411eb8164e024c6a3aa3 100644 (file)
@@ -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
        }
 }
index ba5d8758d93ef3fbfa680558aeceb417a8204c8d..1a5589cd0aa68a55337d661bd320a65a95d91bc6 100644 (file)
@@ -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)
                }
index 6b76e55e2ada45e85f78bc41b8ab0f227e78f194..fd0fc7e1a7f5184a29ba68ecc5c0cc0f20dba6f0 100644 (file)
@@ -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
                }