[dev.ssa] cmd/compile/internal/ssa: fix string index

Change-Id: I984d3e0410ac38c4e42ae8e3670ea47e2140de76
Reviewed-on: https://go-review.googlesource.com/14466
Reviewed-by: Alexandru Moșoi <alexandru@mosoi.ro>
Reviewed-by: Todd Neal <todd@tneal.org>
diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go
index 70350e0..0551ddb 100644
--- a/src/cmd/compile/internal/gc/ssa.go
+++ b/src/cmd/compile/internal/gc/ssa.go
@@ -1693,19 +1693,22 @@
 			a := s.expr(n.Left)
 			i := s.expr(n.Right)
 			i = s.extendIndex(i)
-			var elemtype *Type
-			var len *ssa.Value
 			if n.Left.Type.IsString() {
-				len = s.newValue1(ssa.OpStringLen, Types[TINT], a)
-				elemtype = Types[TUINT8]
+				if !n.Bounded {
+					len := s.newValue1(ssa.OpStringLen, Types[TINT], a)
+					s.boundsCheck(i, len)
+				}
+				ptrtyp := Ptrto(Types[TUINT8])
+				ptr := s.newValue1(ssa.OpStringPtr, ptrtyp, a)
+				ptr = s.newValue2(ssa.OpAddPtr, ptrtyp, ptr, i)
+				return s.newValue2(ssa.OpLoad, Types[TUINT8], ptr, s.mem())
 			} else {
-				len = s.constInt(Types[TINT], n.Left.Type.Bound)
-				elemtype = n.Left.Type.Type
+				if !n.Bounded {
+					len := s.constInt(Types[TINT], n.Left.Type.Bound)
+					s.boundsCheck(i, len)
+				}
+				return s.newValue2(ssa.OpArrayIndex, n.Left.Type.Type, a, i)
 			}
-			if !n.Bounded {
-				s.boundsCheck(i, len)
-			}
-			return s.newValue2(ssa.OpArrayIndex, elemtype, a, i)
 		} else { // slice
 			p := s.addr(n)
 			return s.newValue2(ssa.OpLoad, n.Left.Type.Type, p, s.mem())