...
Source file src/pkg/cmd/compile/internal/ssa/copyelim.go
1
2
3
4
5 package ssa
6
7
8
9 func copyelim(f *Func) {
10
11
12 for _, b := range f.Blocks {
13 for _, v := range b.Values {
14 copyelimValue(v)
15 }
16 }
17
18
19 for _, b := range f.Blocks {
20 if v := b.Control; v != nil && v.Op == OpCopy {
21 b.SetControl(v.Args[0])
22 }
23 }
24
25
26 for _, name := range f.Names {
27 values := f.NamedValues[name]
28 for i, v := range values {
29 if v.Op == OpCopy {
30 values[i] = v.Args[0]
31 }
32 }
33 }
34 }
35
36
37
38 func copySource(v *Value) *Value {
39 w := v.Args[0]
40
41
42
43
44
45
46
47
48
49 slow := w
50 var advance bool
51 for w.Op == OpCopy {
52 w = w.Args[0]
53 if w == slow {
54 w.reset(OpUnknown)
55 break
56 }
57 if advance {
58 slow = slow.Args[0]
59 }
60 advance = !advance
61 }
62
63
64
65
66
67 for v != w {
68 x := v.Args[0]
69 v.SetArg(0, w)
70 v = x
71 }
72 return w
73 }
74
75
76 func copyelimValue(v *Value) {
77 for i, a := range v.Args {
78 if a.Op == OpCopy {
79 v.SetArg(i, copySource(a))
80 }
81 }
82 }
83
View as plain text