1 package Analysis.OoOJava;
3 import java.io.BufferedWriter;
4 import java.io.FileWriter;
5 import java.util.Collection;
6 import java.util.HashSet;
7 import java.util.Hashtable;
8 import java.util.Iterator;
11 import java.util.Map.Entry;
13 import Analysis.Disjoint.AllocSite;
14 import Analysis.Disjoint.Effect;
15 import Analysis.Disjoint.Taint;
16 import IR.Flat.FlatSESEEnterNode;
17 import IR.Flat.TempDescriptor;
19 public class ConflictGraph {
21 public Hashtable<String, ConflictNode> id2cn;
23 public static final int NON_WRITE_CONFLICT = 0;
24 public static final int FINE_GRAIN_EDGE = 1;
25 public static final int COARSE_GRAIN_EDGE = 2;
27 public ConflictGraph() {
28 id2cn = new Hashtable<String, ConflictNode>();
31 public void addLiveInNodeEffect(Taint t, Effect e) {
32 FlatSESEEnterNode sese = t.getSESE();
33 TempDescriptor invar = t.getVar();
34 AllocSite as = t.getAllocSite();
36 String id = invar + "_" + sese.getIdentifier();
38 ConflictNode node = id2cn.get(id);
40 node = new ConflictNode(id, ConflictNode.INVAR);
43 if (!id2cn.containsKey(id)) {
48 node.addEffect(as, e);
53 public void addConflictEdge(int type, ConflictNode nodeU, ConflictNode nodeV) {
55 // if there are two edges between the same node pair, coarse has a
57 Set<ConflictEdge> set = nodeU.getEdgeSet();
58 ConflictEdge toBeRemoved = null;
59 for (Iterator iterator = set.iterator(); iterator.hasNext();) {
60 ConflictEdge conflictEdge = (ConflictEdge) iterator.next();
62 if ((conflictEdge.getVertexU().equals(nodeU) && conflictEdge.getVertexV().equals(nodeV))
63 || (conflictEdge.getVertexU().equals(nodeV) && conflictEdge.getVertexV().equals(nodeU))) {
64 if (conflictEdge.getType() == ConflictGraph.FINE_GRAIN_EDGE
65 && type == ConflictGraph.COARSE_GRAIN_EDGE) {
66 toBeRemoved = conflictEdge;
68 } else if (conflictEdge.getType() == ConflictGraph.COARSE_GRAIN_EDGE
69 && type == ConflictGraph.FINE_GRAIN_EDGE) {
76 if (toBeRemoved != null) {
77 nodeU.getEdgeSet().remove(toBeRemoved);
78 nodeV.getEdgeSet().remove(toBeRemoved);
81 ConflictEdge newEdge = new ConflictEdge(nodeU, nodeV, type);
82 nodeU.addEdge(newEdge);
83 nodeV.addEdge(newEdge);
87 public void analyzeConflicts() {
89 Set<String> keySet = id2cn.keySet();
90 Set<String> analyzedIDSet = new HashSet<String>();
92 for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
93 String nodeID = (String) iterator.next();
94 ConflictNode node = id2cn.get(nodeID);
95 analyzePossibleConflicts(analyzedIDSet, node);
100 private void analyzePossibleConflicts(Set<String> analyzedIDSet, ConflictNode currentNode) {
101 // compare with all nodes
102 // examine the case where self-edge exists
103 if (currentNode.isInVarNode()) {
104 // LiveInNode liveInNode = (LiveInNode) currentNode;
105 // int conflictType=calculateSelfConflictType(liveInNode);
106 // if(conflictType>0){
107 // addConflictEdge(conflictType, currentNode,
112 Set<Entry<String, ConflictNode>> set = id2cn.entrySet();
113 for (Iterator iterator = set.iterator(); iterator.hasNext();) {
114 Entry<String, ConflictNode> entry = (Entry<String, ConflictNode>) iterator.next();
116 String entryNodeID = entry.getKey();
117 ConflictNode entryNode = entry.getValue();
119 if ((!currentNode.getID().equals(entryNodeID))
120 && !(analyzedIDSet.contains(currentNode.getID() + entryNodeID) || analyzedIDSet
121 .contains(entryNodeID + currentNode.getID()))) {
123 if (currentNode.isStallSiteNode() && entryNode.isInVarNode()) {
125 * int conflictType = calculateConflictType((StallSiteNode)
126 * currentNode, (LiveInNode) entryNode); if (conflictType > 0) {
127 * addConflictEdge(conflictType, currentNode, entryNode); }
129 * analyzedIDSet.add(currentNode.getID() + entryNodeID);
131 } else if (currentNode.isInVarNode() && entryNode.isInVarNode()) {
132 int conflictType = calculateConflictType(currentNode, entryNode);
133 if (conflictType > ConflictGraph.NON_WRITE_CONFLICT) {
134 addConflictEdge(conflictType, currentNode, entryNode);
136 analyzedIDSet.add(currentNode.getID() + entryNodeID);
143 private int calculateConflictType(ConflictNode nodeA, ConflictNode nodeB) {
145 int conflictType = ConflictGraph.NON_WRITE_CONFLICT;
147 // if node A has write effects on reading/writing regions of node B
148 Hashtable<AllocSite, Set<Effect>> alloc2readEffectsA = nodeA.getReadEffectSet();
149 Hashtable<AllocSite, Set<Effect>> alloc2writeEffectsA = nodeA.getWriteEffectSet();
150 Hashtable<AllocSite, Set<Effect>> alloc2readEffectsB = nodeB.getReadEffectSet();
151 Hashtable<AllocSite, Set<Effect>> alloc2writeEffectsB = nodeB.getWriteEffectSet();
153 conflictType = updateConflictType(conflictType, determineConflictType(alloc2writeEffectsA,
154 alloc2readEffectsB));
155 conflictType = updateConflictType(conflictType, determineConflictType(alloc2writeEffectsA,
156 alloc2writeEffectsB));
158 // if node B has write effects on reading regions of node A
159 determineConflictType(alloc2writeEffectsB, alloc2readEffectsA);
164 private int determineConflictType(Hashtable<AllocSite, Set<Effect>> nodeAtable,
165 Hashtable<AllocSite, Set<Effect>> nodeBtable) {
167 int conflictType = ConflictGraph.NON_WRITE_CONFLICT;
169 Iterator effectItrA = nodeAtable.entrySet().iterator();
170 while (effectItrA.hasNext()) {
171 Map.Entry meA = (Map.Entry) effectItrA.next();
172 AllocSite asA = (AllocSite) meA.getKey();
173 Set<Effect> esA = (Set<Effect>) meA.getValue();
175 Iterator effectItrB = nodeBtable.entrySet().iterator();
176 while (effectItrB.hasNext()) {
177 Map.Entry meB = (Map.Entry) effectItrB.next();
178 AllocSite asB = (AllocSite) meA.getKey();
179 Set<Effect> esB = (Set<Effect>) meA.getValue();
181 for (Iterator iterator = esA.iterator(); iterator.hasNext();) {
182 Effect effectA = (Effect) iterator.next();
183 for (Iterator iterator2 = esB.iterator(); iterator2.hasNext();) {
184 Effect effectB = (Effect) iterator2.next();
186 if (effectA.getAffectedAllocSite().equals(effectB.getAffectedAllocSite())
187 && effectA.getField().equals(effectB.getField())) {
190 * if(og.isReachable(asA, asB, effectA.getAffectedAllocSite())){
191 * //affected allocation site can be reached from both heap roots
192 * if(isFineGrainConflict()){
193 * conflictType=updateConflictType(conflictType
194 * ,ConflictGraph.FINE_GRAIN_EDGE); }else{
195 * conflictType=updateConflictType
196 * (conflictType,ConflictGraph.COARSE_GRAIN_EDGE); } }
204 return ConflictGraph.FINE_GRAIN_EDGE;
205 // return conflictType;
208 private int updateConflictType(int current, int newType) {
209 if (newType > current) {
216 public HashSet<ConflictEdge> getEdgeSet() {
218 HashSet<ConflictEdge> returnSet = new HashSet<ConflictEdge>();
220 Collection<ConflictNode> nodes = id2cn.values();
221 for (Iterator iterator = nodes.iterator(); iterator.hasNext();) {
222 ConflictNode conflictNode = (ConflictNode) iterator.next();
223 returnSet.addAll(conflictNode.getEdgeSet());
229 public boolean hasConflictEdge() {
231 Set<String> keySet = id2cn.keySet();
232 for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
233 String key = (String) iterator.next();
234 ConflictNode node = id2cn.get(key);
235 if (node.getEdgeSet().size() > 0) {
242 public void writeGraph(String graphName, boolean filter) throws java.io.IOException {
244 graphName = graphName.replaceAll("[\\W]", "");
246 BufferedWriter bw = new BufferedWriter(new FileWriter(graphName + ".dot"));
247 bw.write("graph " + graphName + " {\n");
249 // then visit every heap region node
250 Set<Entry<String, ConflictNode>> s = id2cn.entrySet();
251 Iterator<Entry<String, ConflictNode>> i = s.iterator();
253 HashSet<ConflictEdge> addedSet = new HashSet<ConflictEdge>();
255 while (i.hasNext()) {
256 Entry<String, ConflictNode> entry = i.next();
257 ConflictNode node = entry.getValue();
260 if (node.getID().startsWith("___dst") || node.getID().startsWith("___srctmp")
261 || node.getID().startsWith("___neverused") || node.getID().startsWith("___temp")) {
267 String attributes = "[";
269 attributes += "label=\"ID" + node.getID() + "\\n";
271 if (node.isStallSiteNode()) {
272 attributes += "STALL SITE" + "\\n" + "\"]";
274 attributes += "LIVE-IN" + "\\n" + "\"]";
276 bw.write(entry.getKey() + attributes + ";\n");
278 Set<ConflictEdge> edgeSet = node.getEdgeSet();
279 for (Iterator iterator = edgeSet.iterator(); iterator.hasNext();) {
280 ConflictEdge conflictEdge = (ConflictEdge) iterator.next();
282 ConflictNode u = conflictEdge.getVertexU();
283 ConflictNode v = conflictEdge.getVertexV();
286 String uID = u.getID();
287 String vID = v.getID();
288 if (uID.startsWith("___dst") || uID.startsWith("___srctmp")
289 || uID.startsWith("___neverused") || uID.startsWith("___temp")
290 || vID.startsWith("___dst") || vID.startsWith("___srctmp")
291 || vID.startsWith("___neverused") || vID.startsWith("___temp")) {
296 if (!addedSet.contains(conflictEdge)) {
297 bw.write(" " + u.getID() + "--" + v.getID() + "[label="
298 + conflictEdge.toGraphEdgeString() + ",decorate];\n");
299 addedSet.add(conflictEdge);
305 bw.write(" graphTitle[label=\"" + graphName + "\",shape=box];\n");