[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())