aa
CastNode.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.type.Type;
6 import com.cliffc.aa.type.TypeMem;
7 import com.cliffc.aa.type.TypeTuple;
8 import org.jetbrains.annotations.NotNull;
9 
10 // Gain precision after an If-test.
11 public class CastNode extends Node {
12  public final Type _t; // TypeVar???
13  public CastNode( Node ctrl, Node ret, Type t ) {
14  super(OP_CAST,ctrl,ret); _t=t;
15  Env.GVN._work_dom.add(this);
16  }
17  @Override public String xstr() { return "("+_t+")"; }
18 
19  @Override public Node ideal_reduce() {
20  Node cc = in(0).is_copy(0);
21  if( cc!=null ) return set_def(0,cc);
22  // Cast is useless? Remove same as a TypeNode
23  Node ctrl = in(0), addr = in(1);
24  Type c = ctrl._val, t = addr._val;
25  if( c != Type.CTRL ) return null;
26  if( t.isa(_t) ) return in(1);
27  return null;
28  }
29 
30  @Override public Node ideal_mono() {
31  // Can we hoist control to a higher test?
32  Node ctrl = in(0);
33  Node baseaddr = in(1);
34  while( baseaddr instanceof CastNode ) baseaddr = baseaddr.in(1);
35  while( baseaddr instanceof FreshNode ) baseaddr = ((FreshNode)baseaddr).id();
36  final Node fbaseaddr = baseaddr;
37 
38  Node tru = ctrl.walk_dom_last(n -> checked(n,fbaseaddr));
39  if( tru==null || tru==ctrl ) return null;
40  set_def(0,tru);
41  return this;
42  }
43 
44  @Override public Type value(GVNGCM.Mode opt_mode) {
45  Type c = val(0);
46  if( c != Type.CTRL ) return c.oob();
47  Type t = val(1);
48  if( t.is_forward_ref() ) return Type.SCALAR;
49 
50  // If the cast is in-error, we cannot lift.
51  Node n1 = in(1);
52  if( n1 instanceof FreshNode ) n1 = ((FreshNode)n1).id();
53  if( !checked(in(0),n1) ) return t;
54  // Lift result.
55  return _t.join(t);
56  }
57  @Override public void add_flow_extra(Type old) {
58  // If address sharpens, Cast can go dead because all Load uses make constants.
59  if( _val!=old )
60  Env.GVN.add_flow(this);
61  }
62  @Override public TypeMem live_use(GVNGCM.Mode opt_mode, Node def ) {
63  return def==in(0) ? TypeMem.ALIVE : _live;
64  }
65 
66  @Override public boolean unify(boolean test) { return tvar(1).unify(tvar(),test); }
67 
68  @Override public @NotNull CastNode copy( boolean copy_edges) {
69  CastNode nnn = (CastNode)super.copy(copy_edges);
70  return Env.GVN._work_dom.add(nnn);
71  }
72 
73  private static boolean checked( Node n, Node addr ) {
74  if( !(n instanceof CProjNode && ((CProjNode)n)._idx==1) ) return false; // Not a Cast of a CProj-True
75  Node n0 = n.in(0);
76  if( n0 instanceof IfNode ) {
77  Node na = n0.in(1);
78  if( na instanceof FreshNode ) na = ((FreshNode)na).id();
79  if( na == addr ) return true; // Guarded by If-n-zero
80  }
81  if( n0 instanceof ConNode && ((TypeTuple) n0._val).at(1)==Type.XCTRL )
82  return true;
83  return false;
84  }
85 }
com.cliffc.aa.tvar.TV2.unify
boolean unify(TV2 that, boolean test)
Definition: TV2.java:288
com.cliffc.aa.node.Node.walk_dom_last
Node walk_dom_last(Predicate< Node > P)
Definition: Node.java:863
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.CastNode.checked
static boolean checked(Node n, Node addr)
Definition: CastNode.java:73
com.cliffc.aa.type.Type.join
Type join(Type t)
Definition: Type.java:619
com.cliffc.aa.node.Node._live
TypeMem _live
Definition: Node.java:89
com.cliffc.aa.type.Type.SCALAR
static final Type SCALAR
Definition: Type.java:328
com.cliffc
com.cliffc.aa.node.IfNode
Definition: IfNode.java:9
com.cliffc.aa.node.Node
Definition: Node.java:16
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.node.CProjNode
Definition: CProjNode.java:10
com.cliffc.aa.type.TypeTuple
Definition: TypeTuple.java:11
com.cliffc.aa.node.Node._val
Type _val
Definition: Node.java:88
com.cliffc.aa.node.ConNode
Definition: ConNode.java:9
com.cliffc.aa.Env.GVN
static final GVNGCM GVN
Definition: Env.java:13
com.cliffc.aa.node.CastNode.ideal_mono
Node ideal_mono()
Definition: CastNode.java:30
com.cliffc.aa.node.Node.OP_CAST
static final byte OP_CAST
Definition: Node.java:19
com.cliffc.aa.type.Type.CTRL
static final Type CTRL
Definition: Type.java:326
com.cliffc.aa.node.Node.is_copy
Node is_copy(int idx)
Definition: Node.java:827
com.cliffc.aa.node.Node.in
Node in(int i)
Definition: Node.java:126
com.cliffc.aa.node.CastNode.live_use
TypeMem live_use(GVNGCM.Mode opt_mode, Node def)
Definition: CastNode.java:62
com.cliffc.aa.type.TypeMem.ALIVE
static final TypeMem ALIVE
Definition: TypeMem.java:226
com.cliffc.aa.type.Type.XCTRL
static final Type XCTRL
Definition: Type.java:327
com.cliffc.aa.GVNGCM
Definition: GVNGCM.java:12
com.cliffc.aa.node.CastNode.xstr
String xstr()
Definition: CastNode.java:17
com.cliffc.aa.node.FreshNode
Definition: FreshNode.java:11
com.cliffc.aa.node.CastNode._t
final Type _t
Definition: CastNode.java:12
com.cliffc.aa.node.Node.val
Type val(int idx)
Definition: Node.java:470
com.cliffc.aa
Definition: AA.java:1
com.cliffc.aa.node.CastNode.copy
CastNode copy(boolean copy_edges)
Definition: CastNode.java:68
com.cliffc.aa.node.CastNode
Definition: CastNode.java:11
com.cliffc.aa.node.CastNode.value
Type value(GVNGCM.Mode opt_mode)
Definition: CastNode.java:44
com.cliffc.aa.node.Node.set_def
Node set_def(int idx, Node n)
Definition: Node.java:154
com.cliffc.aa.node.CastNode.ideal_reduce
Node ideal_reduce()
Definition: CastNode.java:19
com.cliffc.aa.GVNGCM._work_dom
final Work _work_dom
Definition: GVNGCM.java:31
com.cliffc.aa.type.Type.oob
Type oob()
Definition: Type.java:635
com.cliffc.aa.node.CastNode.CastNode
CastNode(Node ctrl, Node ret, Type t)
Definition: CastNode.java:13
com.cliffc.aa.GVNGCM.add_flow
public< N extends Node > N add_flow(N n)
Definition: GVNGCM.java:50
com.cliffc.aa.node.Node.tvar
TV2 tvar()
Definition: Node.java:96
com
com.cliffc.aa.node.CastNode.add_flow_extra
void add_flow_extra(Type old)
Definition: CastNode.java:57
com.cliffc.aa.Env
Definition: Env.java:12
com.cliffc.aa.type
Definition: Bits.java:1
com.cliffc.aa.type.Type.is_forward_ref
boolean is_forward_ref()
Definition: Type.java:799
com.cliffc.aa.GVNGCM.Mode
Definition: GVNGCM.java:14
com.cliffc.aa.node.CastNode.unify
boolean unify(boolean test)
Definition: CastNode.java:66