We can still stack allocate and VarKill nodes which don't
escape but their content does.
Fixes #16996
Change-Id: If8aa0fcf2c327b4cb880a3d5af8d213289e6f6bf
Reviewed-on: https://go-review.googlesource.com/28575
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
                }
 
                if haspointers(t.Type) {
-                       if escassignfromtag(e, note, nE.Escretval, src) == EscNone && up.Op != ODEFER && up.Op != OPROC {
+                       if escassignfromtag(e, note, nE.Escretval, src)&EscMask == EscNone && up.Op != ODEFER && up.Op != OPROC {
                                a := src
                                for a.Op == OCONVNOP {
                                        a = a.Left
 
        printnl() // ERROR "live at call to printnl: autotmp_[0-9]+ ret$"
        _ = t
 }
+
+func ddd1(x, y *int) { // ERROR "live at entry to ddd1: x y$"
+       ddd2(x, y) // ERROR "live at call to ddd2: autotmp_[0-9]+$"
+       printnl()  // nothing live here.  See issue 16996.
+}
+func ddd2(a ...*int) { // ERROR "live at entry to ddd2: a$"
+       sink = a[0]
+}
+
+var sink *int
 
        printnl() // ERROR "live at call to printnl: autotmp_[0-9]+ ret$"
        _ = t
 }
+
+func ddd1(x, y *int) { // ERROR "live at entry to ddd1: x y$"
+       ddd2(x, y) // ERROR "live at call to ddd2: autotmp_[0-9]+$"
+       printnl()  // nothing live here.  See issue 16996.
+}
+func ddd2(a ...*int) { // ERROR "live at entry to ddd2: a$"
+       sink = a[0]
+}