...
Source file src/pkg/cmd/compile/internal/ssa/phielim.go
1
2
3
4
5 package ssa
6
7
8
9
10
11
12
13
14
15
16
17
18
19 func phielim(f *Func) {
20 for {
21 change := false
22 for _, b := range f.Blocks {
23 for _, v := range b.Values {
24 copyelimValue(v)
25 change = phielimValue(v) || change
26 }
27 }
28 if !change {
29 break
30 }
31 }
32 }
33
34
35 func phielimValue(v *Value) bool {
36 if v.Op != OpPhi {
37 return false
38 }
39
40
41
42
43 var w *Value
44 for _, x := range v.Args {
45 if x == v {
46 continue
47 }
48 if x == w {
49 continue
50 }
51 if w != nil {
52 return false
53 }
54 w = x
55 }
56
57 if w == nil {
58
59
60 return false
61 }
62 v.Op = OpCopy
63 v.SetArgs1(w)
64 f := v.Block.Func
65 if f.pass.debug > 0 {
66 f.Warnl(v.Pos, "eliminated phi")
67 }
68 return true
69 }
70
View as plain text