/
phi.go
87 lines (67 loc) · 1.6 KB
/
phi.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package ssa
import "github.com/MovingtoMars/nnvm/types"
type Phi struct {
ReferenceHandler
BlockHandler
NameHandler
typ types.Type
incomingValues []Value
incomingBlocks []Value
}
func newPhi(t types.Type) *Phi {
return &Phi{
typ: t,
}
}
func (v *Phi) AddIncoming(val Value, block *Block) {
v.incomingValues = append(v.incomingValues, val)
v.incomingBlocks = append(v.incomingBlocks, block)
val.addReference(v)
block.addReference(v)
}
func (v Phi) GetIncoming(index int) (Value, *Block) {
if index >= len(v.incomingValues) {
panic("Phi.GetIncoming: index out of range")
}
return v.incomingValues[index], v.incomingBlocks[index].(*Block)
}
func (v Phi) NumIncoming() int {
return len(v.incomingValues)
}
func (v *Phi) RemoveIncoming(index int) {
if index >= len(v.incomingValues) {
panic("Phi.RemoveIncoming: index out of range")
}
slices := []*[]Value{
&v.incomingValues,
&v.incomingBlocks,
}
for _, slice := range slices {
(*slice)[index].removeReference(v)
copy((*slice)[index:], (*slice)[index+1:])
(*slice) = (*slice)[:len(*slice)-1]
}
}
func (v Phi) Type() types.Type {
return v.typ
}
func (v *Phi) operands() []*Value {
var ops []*Value
for i, val := range v.incomingValues {
ops = append(ops, &val, &v.incomingBlocks[i])
}
return ops
}
func (v Phi) String() string {
str := "phi " + v.typ.String() + " "
for i, val := range v.incomingValues {
str += "[ " + ValueIdentifier(val) + ", " + ValueIdentifier(v.incomingBlocks[i]) + " ]"
if i < len(v.incomingValues)-1 {
str += ", "
}
}
return str
}
func (_ Phi) IsTerminating() bool {
return false
}