aa
NewStrNode.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.tvar.TV2;
6 import com.cliffc.aa.type.*;
7 import com.cliffc.aa.util.Ary;
8 
9 // Allocates a TypeStr in memory. Weirdly takes a string OBJECT (not pointer),
10 // and produces the pointer. Hence liveness is odd.
11 public abstract class NewStrNode extends NewNode.NewPrimNode<TypeStr> {
12  public NewStrNode( TypeStr to, String name, boolean reads, int op_prec, Type... args) {
13  super(OP_NEWSTR,BitsAlias.STR,to,name,reads,op_prec,args);
14  }
15  @Override public boolean unify( boolean test ) {
16  // Self should always should be a TObj
17  TV2 tvar = tvar();
18  if( tvar.is_dead() ) return false;
19  assert tvar.isa("Obj");
20  // TODO: Structural unification on all fields
21  return false;
22  }
23 
24  @Override TypeStr dead_type() { return TypeStr.XSTR; }
25  protected static void add_libs( Ary<NewPrimNode> INTRINSICS ) {
26  INTRINSICS.push(new ConvertI64Str());
27  INTRINSICS.push(new ConvertF64Str());
28  INTRINSICS.push(new AddStrStr());
29  }
30 
31  // --------------------------------------------------------------------------
32  public static class ConStr extends NewStrNode {
33  public ConStr( String str ) { super(TypeStr.con(str),"con",false,-1,Type.CTRL,TypeMem.ALLMEM,null); }
34  @Override TypeStr valueobj() { return _ts; }
35  @Override public TypeMem live_use(GVNGCM.Mode opt_mode, Node def ) { throw com.cliffc.aa.AA.unimpl(); } // No inputs
36  // Constant Strings intern
37  @Override public int hashCode() { return is_unused() ? super.hashCode() : _ts._hash; }
38  @Override public boolean equals(Object o) { return o instanceof ConStr && _ts==((ConStr)o)._ts; }
39  }
40 
41  public static class ConvertI64Str extends NewStrNode {
42  public ConvertI64Str( ) { super(TypeStr.STR,"str",false,-1,Type.CTRL,TypeMem.ALLMEM,null,TypeInt.INT64); }
43  @Override TypeObj valueobj() {
44  Type t = val(3);
45  if( t.above_center() || !(t instanceof TypeInt) ) return t.oob(TypeStr.STR);
46  if( !t.is_con() ) return TypeStr.STR;
47  return TypeStr.make(false,Long.toString(t.getl()).intern());
48  }
49  @Override public TypeMem live_use(GVNGCM.Mode opt_mode, Node def ) { return TypeMem.ALIVE; }
50  }
51 
52  public static class ConvertF64Str extends NewStrNode {
53  public ConvertF64Str( ) { super(TypeStr.STR,"str",false,-1,Type.CTRL,TypeMem.ALLMEM,null,TypeFlt.FLT64); }
54  @Override TypeObj valueobj() {
55  Type t = val(3);
56  if( t.above_center() || !(t instanceof TypeFlt) ) return t.oob(TypeStr.STR);
57  if( !t.is_con() ) return TypeStr.STR;
58  return TypeStr.make(false,Double.toString(t.getd()).intern());
59  }
60  @Override public TypeMem live_use(GVNGCM.Mode opt_mode, Node def ) { return TypeMem.ALIVE; }
61  }
62 
63  // String concat. NIL values are treated "as-if" the empty string.
64  // If both arguments are NIL, NIL is returned.
65  // If one argument is NIL, the other non-nil argument is returned.
66  // If neither argument is NIL, the two strings are concatenated into a new third string.
67  public static class AddStrStr extends NewStrNode {
68  private static int OP_PREC=7;
70  @Override public Type value(GVNGCM.Mode opt_mode) {
71  if( is_unused() ) return Type.ANY;
72  Type m = val(1);
73  Type sp0 = val(3);
74  Type sp1 = val(4);
75  if( !(m instanceof TypeMem) ) return m.oob();
76  if( sp0==Type.XNIL && sp1==Type.XNIL ) return TypeTuple.make(TypeObj.UNUSED,Type.XNIL);
77  if( !sp0.isa(TypeMemPtr.STR0) ) return _value(TypeStr.STR);
78  if( !sp1.isa(TypeMemPtr.STR0) ) return _value(TypeStr.STR);
79  if( sp0.above_center() || sp1.above_center() ) return Type.ANY;
80  TypeMem mem = (TypeMem)m;
81  TypeObj s0 = sp0==Type.XNIL ? TypeObj.UNUSED : mem.ld((TypeMemPtr)sp0);
82  TypeObj s1 = sp1==Type.XNIL ? TypeObj.UNUSED : mem.ld((TypeMemPtr)sp1);
83  if( sp0==Type.XNIL ) return _value(s1);
84  if( sp1==Type.XNIL ) return _value(s0);
85  if( !(s0 instanceof TypeStr) || !(s1 instanceof TypeStr) ) return _value(TypeStr.STR);
86  TypeStr str0 = (TypeStr)s0;
87  TypeStr str1 = (TypeStr)s1;
88  if( !str0.is_con() || !str1.is_con() ) return _value(TypeStr.STR);
89  return _value(TypeStr.make(false,(str0.getstr()+str1.getstr()).intern()));
90  }
91  TypeTuple _value(TypeObj tobj) { return TypeTuple.make(Type.CTRL,tobj,_tptr); }
92  @Override TypeObj valueobj() { throw com.cliffc.aa.AA.unimpl(); }
93  @Override public byte op_prec() { return (byte)OP_PREC; }
94  @Override public TypeMem live_use(GVNGCM.Mode opt_mode, Node def ) {
95  if( def==in(3) || def==in(4) ) return TypeMem.ALIVE;
96  assert def==in(1);
97  // Memory for aliases is alive, as-if a READ/LOAD
98  Type tmem = val(1);
99  Type tptr0= val(3);
100  Type tptr1= val(4);
101  if( !(tmem instanceof TypeMem ) ) return tmem .oob(TypeMem.ALLMEM); // Not a memory?
102  if( !(tptr0 instanceof TypeMemPtr) ) return tptr0.oob(TypeMem.ALLMEM); // Not a pointer?
103  if( !(tptr1 instanceof TypeMemPtr) ) return tptr1.oob(TypeMem.ALLMEM); // Not a pointer?
104  TypeMem esc0 = ((TypeMem)tmem).remove_no_escapes(((TypeMemPtr)tptr0)._aliases,"",Type.SCALAR);
105  TypeMem esc1 = ((TypeMem)tmem).remove_no_escapes(((TypeMemPtr)tptr1)._aliases,"",Type.SCALAR);
106  return (TypeMem)esc0.meet(esc1);
107  }
108  @Override public void add_flow_use_extra(Node chg) {
109  if( chg==in(3) || chg==in(4) ) Env.GVN.add_flow(in(1)); // Address into a Load changes, the Memory can be more alive.
110  }
111  }
112 }
com.cliffc.aa.node.NewStrNode.ConvertI64Str.valueobj
TypeObj valueobj()
Definition: NewStrNode.java:43
com.cliffc.aa.type.TypeMem.ld
TypeObj ld(TypeMemPtr ptr)
Definition: TypeMem.java:325
com.cliffc.aa.type.Type.isa
boolean isa(Type t)
Definition: Type.java:623
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.node.NewStrNode.AddStrStr.AddStrStr
AddStrStr()
Definition: NewStrNode.java:69
com.cliffc.aa.type.Type.SCALAR
static final Type SCALAR
Definition: Type.java:328
com.cliffc
com.cliffc.aa.type.TypeMem.MEM_STR
static final TypeMem MEM_STR
Definition: TypeMem.java:229
com.cliffc.aa.node.Node
Definition: Node.java:16
com.cliffc.aa.util
Definition: AbstractEntry.java:1
com.cliffc.aa.type.TypeInt
Definition: TypeInt.java:9
com.cliffc.aa.tvar
Definition: TV2.java:1
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.node.NewStrNode.ConStr
Definition: NewStrNode.java:32
com.cliffc.aa.node.NewStrNode.ConvertF64Str.live_use
TypeMem live_use(GVNGCM.Mode opt_mode, Node def)
Definition: NewStrNode.java:60
com.cliffc.aa.type.TypeFlt
Definition: TypeFlt.java:9
com.cliffc.aa.util.Ary
Definition: Ary.java:11
com.cliffc.aa.type.BitsAlias
Definition: BitsAlias.java:8
com.cliffc.aa.type.TypeTuple
Definition: TypeTuple.java:11
com.cliffc.aa.type.TypeMem.ALLMEM
static final TypeMem ALLMEM
Definition: TypeMem.java:228
com.cliffc.aa.node.NewStrNode.AddStrStr.valueobj
TypeObj valueobj()
Definition: NewStrNode.java:92
com.cliffc.aa.type.Type.ANY
static final Type ANY
Definition: Type.java:325
com.cliffc.aa.type.Type.meet
final Type meet(Type t)
Definition: Type.java:412
com.cliffc.aa.node.NewStrNode.AddStrStr
Definition: NewStrNode.java:67
com.cliffc.aa.AA.unimpl
static RuntimeException unimpl()
Definition: AA.java:10
com.cliffc.aa.type.TypeStr.make
static TypeStr make(String name, boolean any, String con)
Definition: TypeStr.java:36
com.cliffc.aa.node.NewStrNode.ConvertI64Str.ConvertI64Str
ConvertI64Str()
Definition: NewStrNode.java:42
com.cliffc.aa.type.Type.getd
double getd()
Definition: Type.java:804
com.cliffc.aa.node.NewStrNode.AddStrStr.live_use
TypeMem live_use(GVNGCM.Mode opt_mode, Node def)
Definition: NewStrNode.java:94
com.cliffc.aa.Env.GVN
static final GVNGCM GVN
Definition: Env.java:13
com.cliffc.aa.type.TypeInt.INT64
static final TypeInt INT64
Definition: TypeInt.java:39
com.cliffc.aa.type.TypeStr.is_con
boolean is_con()
Definition: TypeStr.java:94
com.cliffc.aa.type.TypeObj
Definition: TypeObj.java:15
com.cliffc.aa.node.NewStrNode.ConStr.ConStr
ConStr(String str)
Definition: NewStrNode.java:33
com.cliffc.aa.type.TypeMemPtr.STR0
static final TypeMemPtr STR0
Definition: TypeMemPtr.java:98
com.cliffc.aa.tvar.TV2.is_dead
boolean is_dead()
Definition: TV2.java:81
com.cliffc.aa.type.Type.is_con
boolean is_con()
Definition: Type.java:776
com.cliffc.aa.type.Type.above_center
boolean above_center()
Definition: Type.java:741
com.cliffc.aa.node.NewStrNode.NewStrNode
NewStrNode(TypeStr to, String name, boolean reads, int op_prec, Type... args)
Definition: NewStrNode.java:12
com.cliffc.aa.node.NewNode.NewPrimNode< TypeStr >::INTRINSICS
static final Ary< NewPrimNode > INTRINSICS
Definition: NewNode.java:186
com.cliffc.aa.node.NewStrNode.ConStr.valueobj
TypeStr valueobj()
Definition: NewStrNode.java:34
com.cliffc.aa.node.NewStrNode
Definition: NewStrNode.java:11
com.cliffc.aa.type.Type.CTRL
static final Type CTRL
Definition: Type.java:326
com.cliffc.aa.type.TypeObj.UNUSED
static final TypeObj UNUSED
Definition: TypeObj.java:46
com.cliffc.aa.node.NewStrNode.AddStrStr._value
TypeTuple _value(TypeObj tobj)
Definition: NewStrNode.java:91
com.cliffc.aa.type.TypeTuple.make
static TypeTuple make(boolean any, Type[] ts)
Definition: TypeTuple.java:82
com.cliffc.aa.node.NewStrNode.AddStrStr.add_flow_use_extra
void add_flow_use_extra(Node chg)
Definition: NewStrNode.java:108
com.cliffc.aa.type.TypeStr.XSTR
static final TypeStr XSTR
Definition: TypeStr.java:46
com.cliffc.aa.type.TypeStr.con
static TypeStr con(String con)
Definition: TypeStr.java:42
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.node.NewStrNode.dead_type
TypeStr dead_type()
Definition: NewStrNode.java:24
com.cliffc.aa.type.TypeStr
Definition: TypeStr.java:14
com.cliffc.aa.node.NewStrNode.ConvertI64Str
Definition: NewStrNode.java:41
com.cliffc.aa.node.NewStrNode.AddStrStr.OP_PREC
static int OP_PREC
Definition: NewStrNode.java:68
com.cliffc.aa.node.NewStrNode.ConvertF64Str.valueobj
TypeObj valueobj()
Definition: NewStrNode.java:54
com.cliffc.aa.type.TypeMem.remove_no_escapes
TypeMem remove_no_escapes(BitsAlias escs, String fld, Type live)
Definition: TypeMem.java:479
com.cliffc.aa.tvar.TV2.isa
boolean isa(String s)
Definition: TV2.java:77
com.cliffc.aa.AA
an implementation of language AA
Definition: AA.java:9
com.cliffc.aa.type.TypeStr.getstr
String getstr()
Definition: TypeStr.java:52
com.cliffc.aa
Definition: AA.java:1
com.cliffc.aa.node.NewStrNode.AddStrStr.value
Type value(GVNGCM.Mode opt_mode)
Definition: NewStrNode.java:70
com.cliffc.aa.node.NewNode
Definition: NewNode.java:17
com.cliffc.aa.node.NewStrNode.AddStrStr.op_prec
byte op_prec()
Definition: NewStrNode.java:93
com.cliffc.aa.node.NewStrNode.add_libs
static void add_libs(Ary< NewPrimNode > INTRINSICS)
Definition: NewStrNode.java:25
com.cliffc.aa.node.NewStrNode.ConStr.live_use
TypeMem live_use(GVNGCM.Mode opt_mode, Node def)
Definition: NewStrNode.java:35
com.cliffc.aa.tvar.TV2
Definition: TV2.java:23
com.cliffc.aa.type.Type.oob
Type oob()
Definition: Type.java:635
com.cliffc.aa.node.NewStrNode.ConStr.hashCode
int hashCode()
Definition: NewStrNode.java:37
com.cliffc.aa.node.NewStrNode.unify
boolean unify(boolean test)
Definition: NewStrNode.java:15
com.cliffc.aa.type.Type.XNIL
static final Type XNIL
Definition: Type.java:333
com.cliffc.aa.GVNGCM.add_flow
public< N extends Node > N add_flow(N n)
Definition: GVNGCM.java:50
com.cliffc.aa.type.TypeStr.STR
static final TypeStr STR
Definition: TypeStr.java:45
com.cliffc.aa.type.Type.getl
long getl()
Definition: Type.java:802
com.cliffc.aa.node.NewStrNode.ConvertF64Str
Definition: NewStrNode.java:52
com
com.cliffc.aa.node.NewStrNode.ConvertF64Str.ConvertF64Str
ConvertF64Str()
Definition: NewStrNode.java:53
com.cliffc.aa.Env
Definition: Env.java:12
com.cliffc.aa.type.BitsAlias.STR
static final int STR
Definition: BitsAlias.java:25
com.cliffc.aa.node.NewStrNode.ConStr.equals
boolean equals(Object o)
Definition: NewStrNode.java:38
com.cliffc.aa.type
Definition: Bits.java:1
com.cliffc.aa.type.TypeMemPtr
Definition: TypeMemPtr.java:14
com.cliffc.aa.type.TypeFlt.FLT64
static final TypeFlt FLT64
Definition: TypeFlt.java:38
com.cliffc.aa.GVNGCM.Mode
Definition: GVNGCM.java:14
com.cliffc.aa.node.NewStrNode.ConvertI64Str.live_use
TypeMem live_use(GVNGCM.Mode opt_mode, Node def)
Definition: NewStrNode.java:49