aa
IntrinsicNode.java
Go to the documentation of this file.
1 package com.cliffc.aa.node;
2 
3 import com.cliffc.aa.Env;
4 import com.cliffc.aa.GVNGCM;
5 import com.cliffc.aa.Parse;
6 import com.cliffc.aa.type.*;
7 import com.cliffc.aa.util.Util;
8 
9 import static com.cliffc.aa.AA.*;
10 import static com.cliffc.aa.type.TypeFld.Access;
11 
12 // Function to wrap another type in a Name, which typically involves setting a
13 // vtable like field, i.e. memory updates.
14 // Names an unaliased memory. Needs to collapse away, or else an error.
15 public class IntrinsicNode extends Node {
16  public final TypeObj _tn; // Named type
17  Parse _badargs; // Filled in when inlined in CallNode
18  IntrinsicNode( TypeObj tn, Parse badargs, Node... ns ) {
19  super(OP_NAME,ns);
20  _tn=tn;
21  _badargs=badargs;
22  }
23 
24  @Override public boolean is_mem() { return true; }
25  //@Override public TV2 new_tvar(String alloc_site) { return TV2.make_mem(this,alloc_site); }
26  @Override public String xstr() { return _tn._name; }
27  Node mem() { return in(1); }
28  Node ptr() { return in(2); }
29 
30  // --------------------------------------------------------------------------
31  // Takes in an unaliased piece of memory and Names it: basically sticks a
32  // vtable name type in memory. Unaliased, so the same memory cannot be
33  // referred to without the Name. Error if the memory cannot be proven
34  // unaliased. The Ideal call collapses the Name into the unaliased NewNode.
35  public static FunPtrNode convertTypeName( TypeObj tn, Parse badargs, GVNGCM gvn ) {
36  // The incoming memory type is *exact* and does not have any extra fields.
37  // The usual duck typing is "this-or-below", which allows and ignores extra
38  // fields. For Naming - which involves installing a v-table (or any other
39  // RTTI) the type is exact at that moment. Super-type constructors are
40  // possible but here the type is exact.
41 
42  // This function call takes in and returns a plain ptr-to-object.
43  // Only after folding together does the name become apparent.
44  try(GVNGCM.Build<FunPtrNode> X = Env.GVN.new Build<>()) {
47  FunNode fun = X.init2((FunNode)new FunNode(tn._name,sig,-1,false).add_def(Env.ALL_CTRL));
48  Node rpc = X.xform(new ParmNode( 0 ,"rpc",fun,Env.ALL_CALL,null));
49  Node mem = X.xform(new ParmNode(MEM_IDX,"mem",fun,TypeMem.MEM,Env.DEFMEM,null));
50  Node ptr = X.xform(new ParmNode(ARG_IDX,"ptr",fun,(ConNode)Node.con(TypeMemPtr.make(BitsAlias.RECORD_BITS,TypeObj.ISUSED)),badargs));
51  Node cvt = X.xform(new IntrinsicNode(tn,badargs,fun,mem,ptr));
52  RetNode ret = (RetNode)X.xform(new RetNode(fun,cvt,ptr,rpc,fun));
53  return (X._ret = X.init2(new FunPtrNode(tn._name,ret)));
54  }
55  }
56 
57  // If the input memory is unaliased, fold into the NewNode.
58  // If this node does not fold away, the program is in error.
59  @Override public Node ideal_reduce() {
60  Node mem = mem();
61  Node ptr = ptr();
62  if( mem instanceof MrgProjNode &&
63  mem.in(0)==ptr.in(0) && mem._uses._len==2 ) { // Only self and DefMem users
64  TypeMemPtr tptr = (TypeMemPtr) ptr._val;
65  int alias = tptr._aliases.abit();
66  if( alias > 0 ) { // Not a mixed set of aliases
67  NewObjNode nnn = (NewObjNode)mem.in(0);
68  // NewObjNode is well-typed and producing a pointer to memory with the
69  // correct type? Fold into the NewObjNode and remove this Convert.
70  TypeTuple tnnn = (TypeTuple) nnn._val;
71  Type actual = mem._val.sharptr(tnnn.at(REZ_IDX));
72  if( actual instanceof TypeMemPtr ) actual = ((TypeMemPtr)actual)._obj; // Get the struct
73  Type formal = _tn.remove_name();
74  if( actual.isa(formal) ) { // Actual struct isa formal struct?
75  TypeStruct tn = nnn._ts.make_from(_tn._name);
76  nnn.set_name(tn);
77  nnn.xval(); // Update immediately to preserve monotonicity
78  mem.xval();
79  return mem;
80  }
81  }
82  }
83 
84  // If is of a MemJoin and it can enter the split region, do so.
85  if( _keep==0 && ptr._val instanceof TypeMemPtr && mem instanceof MemJoinNode && mem._uses._len==1 &&
86  ptr instanceof ProjNode && ptr.in(0) instanceof NewNode )
87  return ((MemJoinNode)mem).add_alias_below_new(new IntrinsicNode(_tn,_badargs,null,mem,ptr),this);
88 
89  return null;
90  }
91 
92  // Semantics are to extract a TypeObj from mem and ptr, and if there is no
93  // aliasing, sharpen the TypeObj to a Type with a name. We can be correct and
94  // conservative by doing nothing.
95 
96  // The inputs are a TypeMem and a TypeMemPtr to an unnamed TypeObj. If the
97  // ptr is of the "from" type, we cast a Name to it and produce a pointer to
98  // the "to" type, otherwise we get the most conservative "to" type.
99  @Override public Type value(GVNGCM.Mode opt_mode) {
100  Type mem = mem()._val;
101  Type ptr = ptr()._val;
102  if( !(mem instanceof TypeMem ) ) return mem.oob(); // Inputs are confused
103  if( !(ptr instanceof TypeMemPtr) ) return ptr.oob(); // Inputs are confused
104  TypeMem tmem = (TypeMem)mem;
105  // Get the Obj from the pointer.
106  TypeObj obj = tmem.ld((TypeMemPtr)ptr);
107  TypeObj tn = (TypeObj)_tn.remove_name();
108  if( !obj.isa(tn ) ) return tmem; // Inputs not correct from, and node is in-error
109  if( obj.isa(tn.dual()) ) return tmem;
110  // Wrap result in Name
111  int alias = ((TypeMemPtr)ptr)._aliases.abit();
112  TypeObj rez = (TypeObj)obj.set_name(_tn._name);
113  return tmem.set(alias,rez);
114  }
115  @Override public TypeMem all_live() { return TypeMem.ALLMEM; }
116  @Override public TypeMem live_use(GVNGCM.Mode opt_mode, Node def ) {
117  if( def==mem() ) return _live;
118  return TypeMem.ALIVE;
119  }
120  @Override BitsAlias escapees() { return ptr().in(0).escapees(); }
121  //
122  @Override public ErrMsg err( boolean fast ) {
123  if( fast ) return ErrMsg.FAST;
124  Type ptr = ptr()._val;
125  Type mem = mem()._val;
126  return ErrMsg.typerr(_badargs,ptr,mem,TypeMemPtr.make(BitsAlias.REC,_tn)); // Did not remove the aliasing
127  }
128 
129  // --------------------------------------------------------------------------
130  // Default name constructor using expanded args list. Just a NewObjNode but the
131  // result is a named type. Same as convertTypeName on an unaliased NewObjNode.
132  // Passed in a named TypeStruct, and the parent alias.
133  public static FunPtrNode convertTypeNameStruct( TypeStruct to, int alias, Parse bad ) {
134  assert to.has_name();
135  assert to.fld(0).is_display_ptr(); // Display already
136  // Upgrade the type to one with no display for nnn.
138  // Formal is unnamed, and this function adds the name.
139  TypeTuple formals = TypeTuple.make(to.remove_name());
141 
142  try(GVNGCM.Build<FunPtrNode> X = Env.GVN.new Build<>()) {
143  FunNode fun = (FunNode) X.xform(new FunNode(to._name,sig,-1,false).add_def(Env.ALL_CTRL));
144  Node rpc = X.xform(new ParmNode( 0 ,"rpc",fun,Env.ALL_CALL,null));
145  Node memp= X.xform(new ParmNode(MEM_IDX,"mem",fun,TypeMem.MEM,Env.DEFMEM,null));
146  // Add input edges to the NewNode
147  Node nodisp = Node.con(TypeMemPtr.NO_DISP);
148  NewObjNode nnn = (NewObjNode)X.add(new NewObjNode(false,alias,to,nodisp));
149  for( int i=1; i<to.len(); i++ ) {
150  String argx = to.fld(i)._fld;
151  if( Util.eq(argx,TypeFld.fldBot) ) argx = null;
152  nnn.add_def(X.xform(new ParmNode(i+DSP_IDX,argx,fun, (ConNode)Node.con(to.at(i).simple_ptr()),bad)));
153  }
154  Node mmem = Env.DEFMEM.make_mem_proj(nnn,memp);
155  Node ptr = X.xform(new ProjNode(REZ_IDX, nnn));
156  RetNode ret = (RetNode)X.xform(new RetNode(fun,mmem,ptr,rpc,fun));
157  return (X._ret=X.init2(new FunPtrNode(to._name,ret)));
158  }
159  }
160 
161 }
com.cliffc.aa.type.TypeFld.Access.Final
Final
Definition: TypeFld.java:112
com.cliffc.aa.type.TypeMemPtr.NO_DISP
static final Type NO_DISP
Definition: TypeMemPtr.java:80
com.cliffc.aa.node.IntrinsicNode.is_mem
boolean is_mem()
Definition: IntrinsicNode.java:24
com.cliffc.aa.node.Node.escapees
BitsAlias escapees()
Definition: Node.java:859
com.cliffc.aa.type.TypeMem.ld
TypeObj ld(TypeMemPtr ptr)
Definition: TypeMem.java:325
com.cliffc.aa.type.TypeTuple.make_args
static TypeTuple make_args(Type[] ts)
Definition: TypeTuple.java:106
com.cliffc.aa.type.Type.isa
boolean isa(Type t)
Definition: Type.java:623
com.cliffc.aa.node.IntrinsicNode.convertTypeName
static FunPtrNode convertTypeName(TypeObj tn, Parse badargs, GVNGCM gvn)
Definition: IntrinsicNode.java:35
com.cliffc.aa.type.TypeMem
Memory type; the state of all of memory; memory edges order memory ops.
Definition: TypeMem.java:53
com.cliffc.aa.type.TypeTuple.make_ret
static TypeTuple make_ret(Type trez)
Definition: TypeTuple.java:120
com.cliffc.aa.util.Util.eq
static boolean eq(String s0, String s1)
Definition: Util.java:16
com.cliffc.aa.node.IntrinsicNode.mem
Node mem()
Definition: IntrinsicNode.java:27
com.cliffc.aa.node.Node._live
TypeMem _live
Definition: Node.java:89
com.cliffc
com.cliffc.aa.Env.ALL_CALL
static ConNode ALL_CALL
Definition: Env.java:26
com.cliffc.aa.type.TypeFld
Definition: TypeFld.java:12
com.cliffc.aa.node.Node
Definition: Node.java:16
com.cliffc.aa.util
Definition: AbstractEntry.java:1
com.cliffc.aa.node.IntrinsicNode.value
Type value(GVNGCM.Mode opt_mode)
Definition: IntrinsicNode.java:99
com.cliffc.aa.type.TypeFld.is_display_ptr
boolean is_display_ptr()
Definition: TypeFld.java:190
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.node.MemJoinNode
Definition: MemJoinNode.java:15
com.cliffc.aa.type.TypeFunSig.make
static TypeFunSig make(String[] args, TypeTuple formals, TypeTuple ret)
Definition: TypeFunSig.java:71
com.cliffc.aa.type.BitsAlias
Definition: BitsAlias.java:8
com.cliffc.aa.node.Node.ErrMsg.typerr
static ErrMsg typerr(Parse loc, Type actual, Type t0mem, Type expected)
Definition: Node.java:906
com.cliffc.aa.type.TypeTuple
Definition: TypeTuple.java:11
com.cliffc.aa.node.IntrinsicNode.xstr
String xstr()
Definition: IntrinsicNode.java:26
com.cliffc.aa.type.TypeMem.ALLMEM
static final TypeMem ALLMEM
Definition: TypeMem.java:228
com.cliffc.aa.node.Node._val
Type _val
Definition: Node.java:88
com.cliffc.aa.node.IntrinsicNode.ptr
Node ptr()
Definition: IntrinsicNode.java:28
com.cliffc.aa.node.Node.ErrMsg
Definition: Node.java:888
com.cliffc.aa.node.ConNode
Definition: ConNode.java:9
com.cliffc.aa.node.Node.add_def
Node add_def(Node n)
Definition: Node.java:152
com.cliffc.aa.node.NewObjNode.set_name
void set_name(TypeStruct name)
Definition: NewObjNode.java:45
com.cliffc.aa.node.FunPtrNode
Definition: FunPtrNode.java:40
com.cliffc.aa.node.RetNode
Definition: RetNode.java:19
com.cliffc.aa.type.TypeStruct
A memory-based collection of optionally named fields.
Definition: TypeStruct.java:50
com.cliffc.aa.type.TypeStruct.at
Type at(int idx)
Definition: TypeStruct.java:1013
com.cliffc.aa.type.Type.remove_name
final T remove_name()
Definition: Type.java:556
com.cliffc.aa.type.BitsAlias.REC
static final int REC
Definition: BitsAlias.java:25
com.cliffc.aa.Env.GVN
static final GVNGCM GVN
Definition: Env.java:13
com.cliffc.aa.type.Type.set_name
final T set_name(String name)
Definition: Type.java:551
com.cliffc.aa.type.TypeObj
Definition: TypeObj.java:15
com.cliffc.aa.type.TypeFld.fldBot
static final String fldBot
Definition: TypeFld.java:140
com.cliffc.aa.node.IntrinsicNode.escapees
BitsAlias escapees()
Definition: IntrinsicNode.java:120
com.cliffc.aa.node.IntrinsicNode.err
ErrMsg err(boolean fast)
Definition: IntrinsicNode.java:122
com.cliffc.aa.type.BitsAlias.RECORD_BITS
static BitsAlias RECORD_BITS
Definition: BitsAlias.java:26
com.cliffc.aa.node.Node._keep
byte _keep
Definition: Node.java:86
com.cliffc.aa.node.IntrinsicNode._tn
final TypeObj _tn
Definition: IntrinsicNode.java:16
com.cliffc.aa.util.Util
Definition: Util.java:5
com.cliffc.aa.type.TypeObj.ISUSED
static final TypeObj ISUSED
Definition: TypeObj.java:45
com.cliffc.aa.node.Node.ErrMsg.FAST
static final ErrMsg FAST
Definition: Node.java:893
com.cliffc.aa.type.TypeTuple.make
static TypeTuple make(boolean any, Type[] ts)
Definition: TypeTuple.java:82
com.cliffc.aa.type.TypeFld._fld
String _fld
Definition: TypeFld.java:15
com.cliffc.aa.node.IntrinsicNode.all_live
TypeMem all_live()
Definition: IntrinsicNode.java:115
com.cliffc.aa.node.Node.in
Node in(int i)
Definition: Node.java:126
com.cliffc.aa.type.TypeMemPtr.STRUCT
static final TypeMemPtr STRUCT
Definition: TypeMemPtr.java:101
com.cliffc.aa.type.TypeMem.ALIVE
static final TypeMem ALIVE
Definition: TypeMem.java:226
com.cliffc.aa.GVNGCM
Definition: GVNGCM.java:12
com.cliffc.aa.type.Type.sharptr
Type sharptr(Type ptr)
Definition: Type.java:930
com.cliffc.aa.type.Type.simple_ptr
Type simple_ptr()
Definition: Type.java:358
com.cliffc.aa.type.TypeMem.set
TypeMem set(int alias, TypeObj obj)
Definition: TypeMem.java:434
com.cliffc.aa.node.ProjNode
Definition: ProjNode.java:11
com.cliffc.aa.node.NewNode._ts
T _ts
Definition: NewNode.java:25
com.cliffc.aa.node.NewObjNode
Definition: NewObjNode.java:20
com.cliffc.aa.node.Node.con
static Node con(Type t)
Definition: Node.java:670
com.cliffc.aa.node.Node._uses
Ary< Node > _uses
Definition: Node.java:245
com.cliffc.aa.AA
an implementation of language AA
Definition: AA.java:9
com.cliffc.aa.type.TypeStruct.len
int len(TypeStruct tt)
Definition: TypeStruct.java:865
com.cliffc.aa
Definition: AA.java:1
com.cliffc.aa.type.BitsAlias.make0
static BitsAlias make0(int bit)
Definition: BitsAlias.java:72
com.cliffc.aa.type.TypeStruct.fld
TypeFld fld(int idx)
Definition: TypeStruct.java:1012
com.cliffc.aa.node.NewNode
Definition: NewNode.java:17
com.cliffc.aa.type.TypeStruct.set_fld
TypeStruct set_fld(int i, Type t, Access ff)
Definition: TypeStruct.java:1030
com.cliffc.aa.node.MrgProjNode
Definition: MrgProjNode.java:10
com.cliffc.aa.node.IntrinsicNode._badargs
Parse _badargs
Definition: IntrinsicNode.java:17
com.cliffc.aa.type.Bits.abit
int abit()
Definition: Bits.java:203
com.cliffc.aa.type.TypeMemPtr._aliases
BitsAlias _aliases
Definition: TypeMemPtr.java:16
com.cliffc.aa.type.TypeTuple.at
Type at(int idx)
Definition: TypeTuple.java:182
com.cliffc.aa.type.Type._name
String _name
Definition: Type.java:99
com.cliffc.aa.type.TypeFunSig
Definition: TypeFunSig.java:10
com.cliffc.aa.type.Type.dual
final T dual()
Definition: Type.java:361
com.cliffc.aa.node.ParmNode
Definition: ParmNode.java:14
com.cliffc.aa.node.Node.xval
Type xval()
Definition: Node.java:460
com.cliffc.aa.GVNGCM.Build
Definition: GVNGCM.java:356
com.cliffc.aa.node.IntrinsicNode.convertTypeNameStruct
static FunPtrNode convertTypeNameStruct(TypeStruct to, int alias, Parse bad)
Definition: IntrinsicNode.java:133
com.cliffc.aa.node.IntrinsicNode
Definition: IntrinsicNode.java:15
com.cliffc.aa.type.TypeFld.Access
Definition: TypeFld.java:109
com.cliffc.aa.node.IntrinsicNode.ideal_reduce
Node ideal_reduce()
Definition: IntrinsicNode.java:59
com.cliffc.aa.node.Node.OP_NAME
static final byte OP_NAME
Definition: Node.java:33
com.cliffc.aa.node.FunNode
Definition: FunNode.java:58
com
com.cliffc.aa.type.TypeMem.MEM
static final TypeMem MEM
Definition: TypeMem.java:224
com.cliffc.aa.Env.DEFMEM
static DefMemNode DEFMEM
Definition: Env.java:19
com.cliffc.aa.Env
Definition: Env.java:12
com.cliffc.aa.type
Definition: Bits.java:1
com.cliffc.aa.type.TypeMemPtr
Definition: TypeMemPtr.java:14
com.cliffc.aa.Parse
an implementation of language AA
Definition: Parse.java:68
com.cliffc.aa.Env.ALL_CTRL
static ConNode ALL_CTRL
Definition: Env.java:20
com.cliffc.aa.node.IntrinsicNode.IntrinsicNode
IntrinsicNode(TypeObj tn, Parse badargs, Node... ns)
Definition: IntrinsicNode.java:18
com.cliffc.aa.GVNGCM.Mode
Definition: GVNGCM.java:14
com.cliffc.aa.node.IntrinsicNode.live_use
TypeMem live_use(GVNGCM.Mode opt_mode, Node def)
Definition: IntrinsicNode.java:116
com.cliffc.aa.type.TypeMemPtr.make
static TypeMemPtr make(BitsAlias aliases, TypeObj obj)
Definition: TypeMemPtr.java:66