github.com/jhump/golang-x-tools@v0.0.0-20220218190644-4958d6d39439/go/callgraph/vta/testdata/src/phi_alias.go (about) 1 // Copyright 2021 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // go:build ignore 6 7 package testdata 8 9 type I interface { 10 Foo() 11 } 12 13 type B struct { 14 p int 15 } 16 17 func (b B) Foo() {} 18 19 func Baz(i, j *I, b, c bool) { 20 if b { 21 i = j 22 } 23 *i = B{9} 24 if c { 25 (*i).Foo() 26 } else { 27 (*j).Foo() 28 } 29 } 30 31 // Relevant SSA: 32 // func Baz(i *I, j *I, b bool, c bool): 33 // if b goto 1 else 2 34 // 1: 35 // jump 2 36 // 2: 37 // t0 = phi [0: i, 1: j] #i 38 // t1 = local B (complit) 39 // t2 = &t1.p [#0] 40 // *t2 = 9:int 41 // t3 = *t1 42 // t4 = make I <- B (t3) 43 // *t0 = t4 44 // if c goto 3 else 5 45 // 3: 46 // t5 = *t0 47 // t6 = invoke t5.Foo() 48 // jump 4 49 // 4: 50 // return 51 // 5: 52 // t7 = *j 53 // t8 = invoke t7.Foo() 54 // jump 4 55 56 // Flow chain showing that B reaches (*i).foo(): 57 // t3 (B) -> t4 -> t0 -> t5 58 // Flow chain showing that B reaches (*j).foo(): 59 // t3 (B) -> t4 -> t0 <--> j -> t7 60 61 // WANT: 62 // Local(t0) -> Local(i), Local(j), Local(t5) 63 // Local(i) -> Local(t0) 64 // Local(j) -> Local(t0), Local(t7) 65 // Local(t3) -> Local(t4) 66 // Local(t4) -> Local(t0)