go/pointer: support ssa.SliceToArrayPointer
Updates golang/go#47326
Change-Id: I6b9b59e82b1b93f7a328ba802ad473d4104d7577
Reviewed-on: https://go-review.googlesource.com/c/tools/+/339890
Run-TryBot: Tim King <taking@google.com>
gopls-CI: kokoro <noreply+kokoro@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Guodong Li <guodongli@google.com>
Trust: Robert Findley <rfindley@google.com>
diff --git a/go/pointer/gen.go b/go/pointer/gen.go
index 36e1aef..ef5108a 100644
--- a/go/pointer/gen.go
+++ b/go/pointer/gen.go
@@ -791,7 +791,7 @@
// Some SSA instructions always have singletons points-to sets:
// Alloc, Function, Global, MakeChan, MakeClosure, MakeInterface, MakeMap, MakeSlice.
// Others may be singletons depending on their operands:
-// FreeVar, Const, Convert, FieldAddr, IndexAddr, Slice.
+// FreeVar, Const, Convert, FieldAddr, IndexAddr, Slice, SliceToArrayPointer.
//
// Idempotent. Objects are created as needed, possibly via recursion
// down the SSA value graph, e.g IndexAddr(FieldAddr(Alloc))).
@@ -882,6 +882,11 @@
case *ssa.Slice:
obj = a.objectNode(cgn, v.X)
+ case *ssa.SliceToArrayPointer:
+ // Going from a []T to a *[k]T for some k.
+ // A slice []T is treated as if it were a *T pointer.
+ obj = a.objectNode(cgn, v.X)
+
case *ssa.Convert:
// TODO(adonovan): opt: handle these cases too:
// - unsafe.Pointer->*T conversion acts like Alloc
@@ -1030,6 +1035,12 @@
case *ssa.Slice:
a.copy(a.valueNode(instr), a.valueNode(instr.X), 1)
+ case *ssa.SliceToArrayPointer:
+ // Going from a []T to a *[k]T (for some k) is a single `dst = src` constraint.
+ // Both []T and *[k]T are modelled as an *IdArrayT where IdArrayT is the identity
+ // node for an array of type T, i.e `type IdArrayT struct{elem T}`.
+ a.copy(a.valueNode(instr), a.valueNode(instr.X), 1)
+
case *ssa.If, *ssa.Jump:
// no-op.