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
|
package com.seaofnodes.simple.node;
import com.seaofnodes.print.ExprPrinter;
import com.seaofnodes.simple.codegen.Serialize;
import com.seaofnodes.simple.type.Type;
import com.seaofnodes.simple.type.TypeMem;
import com.seaofnodes.simple.type.TypeTuple;
import com.seaofnodes.simple.util.BAOS;
import java.util.HashMap;
import java.util.IdentityHashMap;
public class ProjNode extends Node implements Proj {
// Which slice of the incoming multipart value
public final int _idx;
// Debugging label
public final String _label;
public ProjNode(Node ctrl, int idx, String label) {
super(new Node[]{ctrl});
_idx = idx;
_label = label;
}
public ProjNode(ProjNode p) { super(p); _idx = p._idx; _label = p._label; }
@Override public Tag serialTag() { return Tag.Proj; }
@Override public void packed( BAOS baos, HashMap<String,Integer> strs, HashMap<Type,Integer> types, IdentityHashMap<Node, Integer> anodes ) {
baos.packed1(_idx);
baos.packed2(_label==null ? 0 : strs.get(_label));
}
static Node make( BAOS bais, String[] strs ) {
return new ProjNode(null, bais.packed1(), strs[bais.packed2()] );
}
@Override public String label() { return _label; }
@Override
protected ExprPrinter<Node> _print1(ExprPrinter<Node> p) {
if( _label != null ) return p.p(_label);
if( in(0) instanceof CallEndNode cend && cend.call()!=null )
return p.n(cend.call());
return p.p("LONELY PROJ");
}
@Override public CFGNode cfg0() {
return in(0) instanceof CFGNode cfg ? cfg : in(0).cfg0();
}
@Override public boolean isMem() { return _type instanceof TypeMem; }
@Override
public Type compute() {
Type t = in(0)._type;
return t instanceof TypeTuple tt ? tt._types[_idx] : t.oob();
}
@Override public Node idealize() { return ((MultiNode)in(0)).pcopy(_idx); }
@Override
public boolean eq( Node n ) { return _idx == ((ProjNode)n)._idx; }
@Override
int hash() { return _idx; }
@Override public int idx() { return _idx; }
@Override public void gather( HashMap<String,Integer> strs ) {
Serialize.gather(strs,_label);
}
}
|