1 package Analysis.OoOJava;
3 import java.util.HashSet;
4 import java.util.Hashtable;
5 import java.util.Iterator;
8 import Analysis.Disjoint.Alloc;
9 import Analysis.Disjoint.AllocSite;
10 import Analysis.Disjoint.Effect;
11 import Analysis.Disjoint.Taint;
12 import IR.Flat.FlatNew;
13 import IR.Flat.FlatNode;
14 import IR.Flat.FlatSESEEnterNode;
15 import IR.Flat.TempDescriptor;
17 public class ConflictNode {
19 protected HashSet<ConflictEdge> edgeSet;
20 protected HashSet<Alloc> allocSet;
21 protected HashSet<Taint> taintSet;
23 protected Hashtable<Alloc, Set<Effect>> alloc2readEffectSet;
24 protected Hashtable<Alloc, Set<Effect>> alloc2writeEffectSet;
25 protected Hashtable<Alloc, Set<Effect>> alloc2strongUpdateEffectSet;
27 protected int nodeType;
29 protected FlatNode stallSite;
30 protected TempDescriptor var;
31 protected FlatSESEEnterNode fsen;
32 protected boolean toBePruned = false;
34 public boolean isTobePruned() {
38 public void setToBePruned(boolean toBePruned) {
39 this.toBePruned = toBePruned;
42 public static final int FINE_READ = 0;
43 public static final int FINE_WRITE = 1;
44 public static final int PARENT_READ = 2;
45 public static final int PARENT_WRITE = 3;
46 public static final int COARSE = 4;
47 public static final int PARENT_COARSE = 5;
48 public static final int SCC = 6;
50 public static final int INVAR = 0;
51 public static final int STALLSITE = 1;
53 public ConflictNode(String id, int nodeType, TempDescriptor var, FlatNode stallSite) {
54 this(id, var, nodeType);
55 this.stallSite = stallSite;
58 public ConflictNode(String id, int nodeType, TempDescriptor var, FlatSESEEnterNode fsen) {
59 this(id, var, nodeType);
63 public ConflictNode(String id, TempDescriptor var, int nodeType) {
64 edgeSet = new HashSet<ConflictEdge>();
65 // redundant views of access root's
66 // allocation sites for efficient retrieval
67 allocSet = new HashSet<Alloc>();
68 taintSet = new HashSet<Taint>();
70 alloc2readEffectSet = new Hashtable<Alloc, Set<Effect>>();
71 alloc2writeEffectSet = new Hashtable<Alloc, Set<Effect>>();
72 alloc2strongUpdateEffectSet = new Hashtable<Alloc, Set<Effect>>();
75 this.nodeType = nodeType;
79 public void addTaint(Taint t) {
83 public Taint getTaint(Alloc as) {
84 for (Iterator iterator = taintSet.iterator(); iterator.hasNext();) {
85 Taint t = (Taint) iterator.next();
86 if (t.getAllocSite().equals(as)) {
93 public void addEffect(Alloc as, Effect e) {
94 if (e.getType() == Effect.read) {
96 } else if (e.getType() == Effect.write) {
97 addWriteEffect(as, e);
99 addStrongUpdateEffect(as, e);
103 public void addReadEffect(Alloc as, Effect e) {
105 Set<Effect> effectSet = alloc2readEffectSet.get(as);
106 if (effectSet == null) {
107 effectSet = new HashSet<Effect>();
111 alloc2readEffectSet.put(as, effectSet);
114 public void addWriteEffect(Alloc as, Effect e) {
116 Set<Effect> effectSet = alloc2writeEffectSet.get(as);
117 if (effectSet == null) {
118 effectSet = new HashSet<Effect>();
122 alloc2writeEffectSet.put(as, effectSet);
125 public void addStrongUpdateEffect(Alloc as, Effect e) {
127 Set<Effect> effectSet = alloc2strongUpdateEffectSet.get(as);
128 if (effectSet == null) {
129 effectSet = new HashSet<Effect>();
133 alloc2strongUpdateEffectSet.put(as, effectSet);
136 public Hashtable<Alloc, Set<Effect>> getReadEffectSet() {
137 return alloc2readEffectSet;
140 public Hashtable<Alloc, Set<Effect>> getWriteEffectSet() {
141 return alloc2writeEffectSet;
144 public Hashtable<Alloc, Set<Effect>> getStrongUpdateEffectSet() {
145 return alloc2strongUpdateEffectSet;
148 public boolean isInVarNode() {
149 if (nodeType == ConflictNode.INVAR) {
155 public boolean isStallSiteNode() {
156 return !isInVarNode();
159 public Set<FlatNew> getFlatNewSet() {
160 Set<FlatNew> fnSet = new HashSet<FlatNew>();
161 for (Iterator iterator = allocSet.iterator(); iterator.hasNext();) {
162 Alloc as = (Alloc) iterator.next();
163 FlatNew fn = as.getFlatNew();
169 public TempDescriptor getVar() {
173 public Set<ConflictEdge> getEdgeSet() {
177 public void addEdge(ConflictEdge edge) {
181 public String getID() {
185 public FlatNode getStallSiteFlatNode() {
189 public int getSESEIdentifier() {
190 return fsen.getIdentifier();
193 public boolean equals(Object o) {
199 if (!(o instanceof ConflictNode)) {
203 ConflictNode in = (ConflictNode) o;
205 if (id.equals(in.id)) {
213 public String toStringAllEffects() {
217 if (!alloc2readEffectSet.isEmpty()) {
218 str += "read effect= " + alloc2readEffectSet.toString() + "\n";
221 if (!alloc2writeEffectSet.isEmpty()) {
222 str += "write effect = " + alloc2writeEffectSet.toString() + "\n";
225 if (!alloc2strongUpdateEffectSet.isEmpty()) {
226 str += "SU effect = " + alloc2strongUpdateEffectSet.toString() + "\n";
232 public String toString() {
236 public boolean IsValidToPrune() {
238 for (Iterator iterator = edgeSet.iterator(); iterator.hasNext();) {
239 ConflictEdge edge = (ConflictEdge) iterator.next();
241 if (edge.getVertexU() == edge.getVertexV()) {
242 // self-conflict, need to generate traverser
246 if (edge.getVertexU() == this) {
247 if (edge.getVertexV().isInVarNode()) {
248 // has a conflict with invar, need to generate traverser
252 if (edge.getVertexU().isInVarNode()) {
253 // has a conflict with invar, need to generate traverser