aa
FP2DispNode.java
Go to the documentation of this file.
1 package com.cliffc.aa.node;
2 
3 import com.cliffc.aa.GVNGCM;
4 import com.cliffc.aa.type.*;
5 
6 // Extract a Display pointer (a TypeMemPtr) from a TypeFunPtr.
7 public final class FP2DispNode extends Node {
8  public FP2DispNode( Node funptr ) { super(OP_FP2DISP,funptr); }
9 
10  @Override public Node ideal_reduce() {
11  // If at a FunPtrNode, it is only making a TFP out of a code pointer and a
12  // display. Become the display (dropping the code pointer).
13  Node in0 = in(0);
14  Node disp = fptr2disp(in0);
15  if( disp != null ) return disp;
16  // If all inputs to an Unresolved are FunPtrs with the same Display, become that display.
17  if( in0 instanceof UnresolvedNode ) {
18  for( Node in : in0._defs ) {
19  Node disp2 = fptr2disp(in);
20  if( disp==null ) disp = disp2;
21  else if( disp!=disp2 )
22  return null;
23  }
24  return disp;
25  }
26 
27  // FP2Disp can move out of a Call, if the function has no Parm:mem - happens
28  // for single target calls that do not (have not yet) inlined.
29  if( in0 instanceof ProjNode && in0.in(0) instanceof CallNode ) {
30  int idx = ((ProjNode)in0)._idx;
31  Node fptr = in0.in(0).in(idx);
32  return set_def(0,fptr);
33  }
34 
35  // Move past a 'fresh', just getting the display not a 'fresh' copy of the function TVar.
36  if( in(0) instanceof FreshNode && ((FreshNode)in(0)).id() != in(0) )
37  return set_def(0,((FreshNode)in(0)).id());
38 
39  return null;
40  }
41 
43  if( in instanceof FunPtrNode ) {
44  FunPtrNode fptr = (FunPtrNode)in;
45  if( !fptr.is_forward_ref() )
46  return fptr.display();
47  }
48  return null;
49  }
50 
51  @Override public Type value(GVNGCM.Mode opt_mode) {
52  Type t = val(0);
53  return t instanceof TypeFunPtr ? ((TypeFunPtr)t)._disp.simple_ptr() : t.oob();
54  }
55  @Override public TypeMem live_use(GVNGCM.Mode opt_mode, Node def ) { return def instanceof ThretNode ? TypeMem.ANYMEM : _live; }
56 }
com.cliffc.aa.node.FP2DispNode.fptr2disp
Node fptr2disp(Node in)
Definition: FP2DispNode.java:42
com.cliffc.aa.type.TypeFunPtr
Definition: TypeFunPtr.java:23
com.cliffc.aa.node.ThretNode
Definition: ThretNode.java:14
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.Node._live
TypeMem _live
Definition: Node.java:89
com.cliffc
com.cliffc.aa.node.Node
Definition: Node.java:16
com.cliffc.aa.node.FP2DispNode
Definition: FP2DispNode.java:7
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.node.FunPtrNode
Definition: FunPtrNode.java:40
com.cliffc.aa.node.FP2DispNode.FP2DispNode
FP2DispNode(Node funptr)
Definition: FP2DispNode.java:8
com.cliffc.aa.node.CallNode
Definition: CallNode.java:86
com.cliffc.aa.type.TypeMem.ANYMEM
static final TypeMem ANYMEM
Definition: TypeMem.java:228
com.cliffc.aa.node.FP2DispNode.ideal_reduce
Node ideal_reduce()
Definition: FP2DispNode.java:10
com.cliffc.aa.type.TypeFunPtr._disp
Type _disp
Definition: TypeFunPtr.java:28
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.Type.simple_ptr
Type simple_ptr()
Definition: Type.java:358
com.cliffc.aa.node.FreshNode
Definition: FreshNode.java:11
com.cliffc.aa.node.ProjNode
Definition: ProjNode.java:11
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.UnresolvedNode
Definition: UnresolvedNode.java:13
com.cliffc.aa.node.FunPtrNode.is_forward_ref
boolean is_forward_ref()
Definition: FunPtrNode.java:216
com.cliffc.aa.node.FP2DispNode.value
Type value(GVNGCM.Mode opt_mode)
Definition: FP2DispNode.java:51
com.cliffc.aa.node.Node.set_def
Node set_def(int idx, Node n)
Definition: Node.java:154
com.cliffc.aa.node.Node.OP_FP2DISP
static final byte OP_FP2DISP
Definition: Node.java:26
com.cliffc.aa.type.Type.oob
Type oob()
Definition: Type.java:635
com.cliffc.aa.node.FunPtrNode.display
Node display()
Definition: FunPtrNode.java:63
com
com.cliffc.aa.node.FP2DispNode.live_use
TypeMem live_use(GVNGCM.Mode opt_mode, Node def)
Definition: FP2DispNode.java:55
com.cliffc.aa.type
Definition: Bits.java:1
com.cliffc.aa.node.Node._defs
Ary< Node > _defs
Definition: Node.java:124
com.cliffc.aa.GVNGCM.Mode
Definition: GVNGCM.java:14