aa
UnresolvedNode.java
Go to the documentation of this file.
1 package com.cliffc.aa.node;
2 
3 import com.cliffc.aa.*;
4 import com.cliffc.aa.type.BitsFun;
5 import com.cliffc.aa.type.Type;
7 import com.cliffc.aa.util.Util;
8 
9 import java.util.Arrays;
10 
11 import static com.cliffc.aa.AA.ARG_IDX;
12 
13 public class UnresolvedNode extends UnOrFunPtrNode {
14  private final Parse _bad;
15  UnresolvedNode( Parse bad, Node... funs ) { super(OP_UNR,funs); _bad = bad; }
16  @Override public String xstr() {
17  if( is_dead() ) return "DEAD";
18  if( in(0) instanceof FunPtrNode ) {
19  FunPtrNode fptr = (FunPtrNode)in(0);
20  FunNode fun = fptr.xfun();
21  return "Unr:"+(fun==null ? "null" : fun.xstr());
22  }
23  return "Unr???";
24  }
25  @Override public Node ideal_reduce() {
26  if( _defs._len < 2 ) // One function, consumer should treat as a copy
27  throw com.cliffc.aa.AA.unimpl(); // Should collapse
28  // Back-to-back Unresolved collapse (happens due to inlining)
29  boolean progress=false;
30  for( int i=0; i<_defs._len; i++ ) {
31  if( in(i) instanceof UnresolvedNode ) {
32  progress = true;
33  Node u = in(i);
34 // TODO: folding a primitive Unresolved, instead probably need to make a new one...
35  for( int j=0; j<u._defs._len; j++ )
36  add_def(u.in(j));
37  set_def(i,pop());
38  }
39  }
40  return progress ? this : null;
41  }
42 
43  // Required property for value():
44  // ANY >= value(ANY) >= value(other) >= value(ALL) >= ALL
45  @Override public Type value(GVNGCM.Mode opt_mode) {
46  switch( opt_mode ) {
47  case PesiCG:
48  return _val; // Freeze after GVN - only still around for errors
49  case Parse:
50  case PesiNoCG:
51  Type t = Type.ANY;
52  for( Node def : _defs ) {
53  Type td = def._val;
54  if( !(td instanceof TypeFunPtr) ) return td.oob();
55  t = t.meet(td);
56  }
57  return t;
58  case Opto:
59  // If all inputs are TFPs, result is a high choice of TFPs, plus the
60  // normal join over displays.
61  BitsFun fidxs = BitsFun.EMPTY;
62  Type tdsp = Type.ALL;
63  int nargs = -1;
64  for( Node fptr : _defs ) {
65  Type td = fptr._val;
66  if( !(td instanceof TypeFunPtr) ) return td.oob();
67  TypeFunPtr tfp = (TypeFunPtr)td;
68  fidxs = fidxs.meet((tfp.above_center() ? tfp.dual() : tfp)._fidxs);
69  tdsp = tdsp.join(tfp._disp);
70  nargs = tfp._nargs;
71  }
72  return TypeFunPtr.make(fidxs.dual(),nargs,tdsp);
73  default: throw com.cliffc.aa.AA.unimpl();
74  }
75  }
76 
77  //@Override public TV2 new_tvar(String alloc_site) {
78  // return TV2.make("Fun",this,alloc_site);
79  //}
80  //
81  //@Override public boolean unify( boolean test ) {
82  // // Giant assert that all inputs are all Fun, ignoring dead.
83  // for( Node n : _defs )
84  // assert n.tvar().is_dead() || n.tvar().isa("Fun");
85  // return false;
86  //}
87 
88  // Validate same name, operator-precedence and thunking
89  private void add_def_unresolved( FunPtrNode ptr ) {
90  if( _defs._len>0 ) {
91  FunPtrNode ptr0 = (FunPtrNode) in(0);
92  assert Util.eq(ptr0._name, ptr._name);
93  // Actually, equal op_prec & thunk only for binary ops
94  assert ptr0.fun()._op_prec == ptr.fun()._op_prec || ptr0.nargs()== AA.ARG_IDX+1; // Either a uniop, or same precedence
95  assert ptr0.fun()._thunk_rhs == ptr.fun()._thunk_rhs;
96  }
97  add_def(ptr);
98  }
99 
100  // Filter out all the wrong-arg-count functions from Parser.
101  @Override public UnOrFunPtrNode filter( int nargs ) {
102  UnOrFunPtrNode x = null;
103  for( Node epi : _defs ) {
104  FunPtrNode fptr = (FunPtrNode)epi;
105  // User-nargs are user-visible #arguments.
106  // Fun-nargs include the ctrl, display & memory, hence the +ARG_IDX.
107  if( fptr.nargs() != ARG_IDX+nargs ) continue;
108  if( fptr.op_prec()==0 ) continue; // Balanced op
109  if( x == null ) x = fptr.keep();
110  else if( x instanceof UnresolvedNode ) ((UnresolvedNode)x).add_def_unresolved(fptr);
111  else x = new UnresolvedNode(_bad,x.unkeep(),fptr).keep();
112  }
113  return x==null ? null : (UnOrFunPtrNode)Env.GVN.xform(x.unkeep());
114  }
115 
116  // Return a funptr for this fidx.
117  FunPtrNode find_fidx( int fidx ) {
118  for( Node n : _defs )
119  if( ((FunPtrNode)n).ret()._fidx==fidx )
120  return (FunPtrNode)n;
121  return null;
122  }
123 
124  // Same NARGS across all defs
125  @Override public int nargs() { return funptr().nargs(); }
126  @Override public FunPtrNode funptr() { return (FunPtrNode)_defs.at(0); }
127  @Override public UnresolvedNode unk() { return this; }
128 
129  // Return the op_prec of the returned value. Not sensible except when called
130  // on primitives. Should be the same across all defs.
131  @Override public byte op_prec() { return _defs.at(0).op_prec(); }
132  @Override public int hashCode() { return super.hashCode()+(_bad==null ? 0 : _bad.hashCode()); }
133  @Override public boolean equals(Object o) {
134  if( !super.equals(o) ) return false;
135  return _bad==((UnresolvedNode)o)._bad;
136  }
137  // Make a copy with an error message
138  public UnresolvedNode copy(Parse bad) {
139  return new UnresolvedNode(bad,Arrays.copyOf(_defs._es,_defs._len));
140  }
141 
142  // Choice of typically primitives, all of which are pure.
143  // Instead of returning the pre-call memory on true, returns self.
144  @Override Node is_pure_call() {
145  for( Node fun : _defs )
146  if( fun.is_pure_call() == null )
147  return null;
148  return this; // Yes, all choices are pure
149  }
150 }
com.cliffc.aa.type.Bits.dual
B dual()
Definition: Bits.java:368
com.cliffc.aa.node.UnresolvedNode.find_fidx
FunPtrNode find_fidx(int fidx)
Definition: UnresolvedNode.java:117
com.cliffc.aa.type.BitsFun.EMPTY
static final BitsFun EMPTY
Definition: BitsFun.java:37
com.cliffc.aa.type.TypeFunPtr
Definition: TypeFunPtr.java:23
com.cliffc.aa.type.TypeFunPtr._nargs
int _nargs
Definition: TypeFunPtr.java:27
com.cliffc.aa.util.Util.eq
static boolean eq(String s0, String s1)
Definition: Util.java:16
com.cliffc.aa.type.Type.join
Type join(Type t)
Definition: Type.java:619
com.cliffc.aa.Parse.hashCode
int hashCode()
Definition: Parse.java:1497
com.cliffc.aa.node.FunNode._op_prec
final byte _op_prec
Definition: FunNode.java:65
com.cliffc
com.cliffc.aa.node.UnresolvedNode._bad
final Parse _bad
Definition: UnresolvedNode.java:14
com.cliffc.aa.node.Node
Definition: Node.java:16
com.cliffc.aa.util
Definition: AbstractEntry.java:1
com.cliffc.aa.node.UnresolvedNode.add_def_unresolved
void add_def_unresolved(FunPtrNode ptr)
Definition: UnresolvedNode.java:89
com.cliffc.aa.node.UnOrFunPtrNode
Definition: UnOrFunPtrNode.java:6
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.node.Node.keep
public< N extends Node > N keep()
Definition: Node.java:228
com.cliffc.aa.AA.ARG_IDX
static final int ARG_IDX
Definition: AA.java:17
com.cliffc.aa.node.Node._val
Type _val
Definition: Node.java:88
com.cliffc.aa.type.Type.ANY
static final Type ANY
Definition: Type.java:325
com.cliffc.aa.node.Node.add_def
Node add_def(Node n)
Definition: Node.java:152
com.cliffc.aa.node.FunPtrNode
Definition: FunPtrNode.java:40
com.cliffc.aa.node.FunNode.xstr
String xstr()
Definition: FunNode.java:105
com.cliffc.aa.type.Type.meet
final Type meet(Type t)
Definition: Type.java:412
com.cliffc.aa.AA.unimpl
static RuntimeException unimpl()
Definition: AA.java:10
com.cliffc.aa.type.Type.ALL
static final Type ALL
Definition: Type.java:324
com.cliffc.aa.node.UnresolvedNode.filter
UnOrFunPtrNode filter(int nargs)
Definition: UnresolvedNode.java:101
com.cliffc.aa.GVNGCM.xform
Node xform(Node n)
Definition: GVNGCM.java:126
com.cliffc.aa.node.UnresolvedNode.UnresolvedNode
UnresolvedNode(Parse bad, Node... funs)
Definition: UnresolvedNode.java:15
com.cliffc.aa.node.UnresolvedNode.is_pure_call
Node is_pure_call()
Definition: UnresolvedNode.java:144
com.cliffc.aa.node.UnresolvedNode.nargs
int nargs()
Definition: UnresolvedNode.java:125
com.cliffc.aa.Env.GVN
static final GVNGCM GVN
Definition: Env.java:13
com.cliffc.aa.node.UnresolvedNode.unk
UnresolvedNode unk()
Definition: UnresolvedNode.java:127
com.cliffc.aa.node.Node.unkeep
public< N extends Node > N unkeep()
Definition: Node.java:232
com.cliffc.aa.node.FunPtrNode.xfun
FunNode xfun()
Definition: FunPtrNode.java:65
com.cliffc.aa.node.UnresolvedNode.op_prec
byte op_prec()
Definition: UnresolvedNode.java:131
com.cliffc.aa.node.UnOrFunPtrNode.UnOrFunPtrNode
UnOrFunPtrNode(byte op, Node... funs)
Definition: UnOrFunPtrNode.java:7
com.cliffc.aa.node.Node.is_dead
boolean is_dead()
Definition: Node.java:820
com.cliffc.aa.type.TypeFunPtr._disp
Type _disp
Definition: TypeFunPtr.java:28
com.cliffc.aa.util.Util
Definition: Util.java:5
com.cliffc.aa.node.FunPtrNode.nargs
int nargs()
Definition: FunPtrNode.java:66
com.cliffc.aa.node.Node.in
Node in(int i)
Definition: Node.java:126
com.cliffc.aa.GVNGCM
Definition: GVNGCM.java:12
com.cliffc.aa.type.TypeFunPtr.make
static TypeFunPtr make(BitsFun fidxs, int nargs, Type disp)
Definition: TypeFunPtr.java:67
com.cliffc.aa.node.FunPtrNode.op_prec
byte op_prec()
Definition: FunPtrNode.java:186
com.cliffc.aa.node.UnresolvedNode.copy
UnresolvedNode copy(Parse bad)
Definition: UnresolvedNode.java:138
com.cliffc.aa.type.BitsFun
Definition: BitsFun.java:7
com.cliffc.aa.AA
an implementation of language AA
Definition: AA.java:9
com.cliffc.aa.node.UnresolvedNode.value
Type value(GVNGCM.Mode opt_mode)
Definition: UnresolvedNode.java:45
com.cliffc.aa
Definition: AA.java:1
com.cliffc.aa.node.UnresolvedNode
Definition: UnresolvedNode.java:13
com.cliffc.aa.type.TypeFunPtr.above_center
boolean above_center()
Definition: TypeFunPtr.java:130
com.cliffc.aa.node.UnresolvedNode.funptr
FunPtrNode funptr()
Definition: UnresolvedNode.java:126
com.cliffc.aa.node.FunPtrNode._name
String _name
Definition: FunPtrNode.java:41
com.cliffc.aa.node.UnresolvedNode.equals
boolean equals(Object o)
Definition: UnresolvedNode.java:133
com.cliffc.aa.node.Node.set_def
Node set_def(int idx, Node n)
Definition: Node.java:154
com.cliffc.aa.type.Type.dual
final T dual()
Definition: Type.java:361
com.cliffc.aa.node.Node.OP_UNR
static final byte OP_UNR
Definition: Node.java:51
com.cliffc.aa.type.Type.oob
Type oob()
Definition: Type.java:635
com.cliffc.aa.node.Node.pop
Node pop()
Definition: Node.java:174
com.cliffc.aa.node.FunPtrNode.fun
FunNode fun()
Definition: FunPtrNode.java:64
com.cliffc.aa.node.FunNode
Definition: FunNode.java:58
com.cliffc.aa.type.Bits.meet
B meet(final B bs)
Definition: Bits.java:298
com
com.cliffc.aa.node.UnresolvedNode.ideal_reduce
Node ideal_reduce()
Definition: UnresolvedNode.java:25
com.cliffc.aa.Env
Definition: Env.java:12
com.cliffc.aa.type
Definition: Bits.java:1
com.cliffc.aa.node.UnresolvedNode.xstr
String xstr()
Definition: UnresolvedNode.java:16
com.cliffc.aa.node.Node._defs
Ary< Node > _defs
Definition: Node.java:124
com.cliffc.aa.node.FunNode._thunk_rhs
final boolean _thunk_rhs
Definition: FunNode.java:68
com.cliffc.aa.node.UnresolvedNode.hashCode
int hashCode()
Definition: UnresolvedNode.java:132
com.cliffc.aa.Parse
an implementation of language AA
Definition: Parse.java:68
com.cliffc.aa.GVNGCM.Mode
Definition: GVNGCM.java:14