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;
10 import java.util.Map.Entry;
12 import Analysis.OwnershipAnalysis.HeapRegionNode;
13 import IR.Flat.FlatMethod;
14 import IR.Flat.FlatSESEEnterNode;
15 import IR.Flat.TempDescriptor;
17 public class ConflictGraph {
19 static private int uniqueCliqueIDcount = 100;
21 public Hashtable<String, ConflictNode> id2cn;
23 public ConflictGraph() {
24 id2cn = new Hashtable<String, ConflictNode>();
27 public void addPseudoEdgeBetweenReadOnlyNode() {
29 Collection<ConflictNode> conflictNodes = id2cn.values();
30 Set<String> analyzedIDSet = new HashSet<String>();
32 for (Iterator iterator = conflictNodes.iterator(); iterator.hasNext();) {
33 ConflictNode conflictNode = (ConflictNode) iterator.next();
34 if (isReadOnly(conflictNode)
35 && conflictNode.getEdgeSet().size() > 0) {
37 for (Iterator<ConflictNode> iter = id2cn.values().iterator(); iter
39 ConflictNode nextNode = iter.next();
41 if (!conflictNode.equals(nextNode)
42 && nextNode.getEdgeSet().size() > 0
43 && !analyzedIDSet.contains(conflictNode.getID()
45 && !analyzedIDSet.contains(nextNode.getID()
46 + conflictNode.getID())
47 && isReadOnly(nextNode)) {
48 if (hasSameReadEffects(conflictNode, nextNode)) {
49 addConflictEdge(ConflictEdge.PSEUDO_EDGE,
50 conflictNode, nextNode);
53 analyzedIDSet.add(conflictNode.getID() + nextNode.getID());
59 private boolean hasSameReadEffects(ConflictNode nodeA, ConflictNode nodeB) {
61 StallSiteNode stallSiteNode = null;
62 LiveInNode liveInNode = null;
64 if (nodeA instanceof StallSiteNode && nodeB instanceof StallSiteNode) {
65 return hasSameReadEffects((StallSiteNode) nodeA,
66 (StallSiteNode) nodeB);
69 if (nodeA instanceof StallSiteNode) {
70 stallSiteNode = (StallSiteNode) nodeA;
72 liveInNode = (LiveInNode) nodeA;
75 if (nodeB instanceof StallSiteNode) {
76 stallSiteNode = (StallSiteNode) nodeB;
78 liveInNode = (LiveInNode) nodeB;
81 if (stallSiteNode != null) {
82 return hasSameReadEffects(stallSiteNode, liveInNode);
84 return hasSameReadEffects((LiveInNode) nodeA, (LiveInNode) nodeB);
89 private boolean hasSameReadEffects(LiveInNode linA, LiveInNode linB) {
91 Set<SESEEffectsKey> readSetA = linA.getReadEffectsSet();
92 Set<SESEEffectsKey> readSetB = linB.getReadEffectsSet();
94 boolean returnValue = true;
95 for (Iterator iterator = readSetA.iterator(); iterator.hasNext();) {
96 SESEEffectsKey seseEffectsKey = (SESEEffectsKey) iterator.next();
98 for (Iterator iterator2 = readSetB.iterator(); iterator2.hasNext();) {
99 SESEEffectsKey opr = (SESEEffectsKey) iterator2.next();
100 if (!(seseEffectsKey.getHRNUniqueId().equals(
101 opr.getHRNUniqueId()) && seseEffectsKey
102 .getFieldDescriptor().equals(opr.getFieldDescriptor()))) {
110 private boolean hasSameReadEffects(StallSiteNode ssnA, StallSiteNode ssnB) {
112 HashSet<Effect> effectSetA = ssnA.getStallSite().getEffectSet();
113 HashSet<HeapRegionNode> nodeSetA = ssnA.getStallSite().getHRNSet();
114 HashSet<Effect> effectSetB = ssnB.getStallSite().getEffectSet();
115 HashSet<HeapRegionNode> nodeSetB = ssnA.getStallSite().getHRNSet();
116 boolean returnValue = true;
118 for (Iterator iteratorA = effectSetA.iterator(); iteratorA.hasNext();) {
119 Effect effectKeyA = (Effect) iteratorA.next();
120 for (Iterator iterator2A = nodeSetA.iterator(); iterator2A
122 HeapRegionNode hrnA = (HeapRegionNode) iterator2A.next();
124 for (Iterator iteratorB = effectSetB.iterator(); iteratorB
126 Effect effectKeyB = (Effect) iteratorB.next();
127 for (Iterator iterator2B = nodeSetB.iterator(); iterator2B
129 HeapRegionNode hrnB = (HeapRegionNode) iterator2B
132 if (!(hrnA.getGloballyUniqueIdentifier().equals(
133 hrnB.getGloballyUniqueIdentifier()) && effectKeyA
134 .getField().equals(effectKeyB.getField()))) {
147 private boolean hasSameReadEffects(StallSiteNode ssnA, LiveInNode linB) {
149 HashSet<Effect> effectSetA = ssnA.getStallSite().getEffectSet();
150 HashSet<HeapRegionNode> nodeSetA = ssnA.getStallSite().getHRNSet();
152 Set<SESEEffectsKey> readSetB = linB.getReadEffectsSet();
153 if (readSetB == null) {
157 boolean returnValue = true;
159 for (Iterator iterator = effectSetA.iterator(); iterator.hasNext();) {
160 Effect effectKey = (Effect) iterator.next();
161 for (Iterator iterator2 = nodeSetA.iterator(); iterator2.hasNext();) {
162 HeapRegionNode hrn = (HeapRegionNode) iterator2.next();
164 for (Iterator iterator3 = readSetB.iterator(); iterator3
166 SESEEffectsKey seseEffectsKey = (SESEEffectsKey) iterator3
169 if (!(seseEffectsKey.getHRNUniqueId().equals(
170 hrn.getGloballyUniqueIdentifier()) && seseEffectsKey
171 .getFieldDescriptor().equals(effectKey.getField()))) {
183 private boolean isReadOnly(ConflictNode node) {
185 if (node instanceof StallSiteNode) {
186 StallSiteNode stallSiteNode = (StallSiteNode) node;
187 HashSet<Effect> effectSet = stallSiteNode.getStallSite()
189 for (Iterator iterator = effectSet.iterator(); iterator.hasNext();) {
190 Effect effect = (Effect) iterator.next();
191 if (effect.getEffectType().equals(StallSite.WRITE_EFFECT)) {
196 LiveInNode liveInNode = (LiveInNode) node;
197 Set<SESEEffectsKey> writeEffectSet = liveInNode
198 .getWriteEffectsSet();
199 if (writeEffectSet != null && writeEffectSet.size() > 0) {
207 public void analyzeConflicts() {
209 Set<String> keySet = id2cn.keySet();
210 Set<String> analyzedIDSet = new HashSet<String>();
212 for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
213 String nodeID = (String) iterator.next();
214 ConflictNode node = id2cn.get(nodeID);
215 analyzePossibleConflicts(analyzedIDSet, node);
219 private boolean isWriteConflicts(StallSiteNode nodeA, LiveInNode nodeB) {
221 boolean result = false;
222 StallSite stallSite = nodeA.getStallSite();
224 Set<SESEEffectsKey> writeEffectsSet = nodeB.getWriteEffectsSet();
225 Set<SESEEffectsKey> readEffectsSet = nodeB.getReadEffectsSet();
227 if (writeEffectsSet != null) {
228 Iterator<SESEEffectsKey> writeIter = writeEffectsSet.iterator();
229 while (writeIter.hasNext()) {
230 SESEEffectsKey seseEffectsKey = (SESEEffectsKey) writeIter
232 String writeHeapRegionID = seseEffectsKey.getHRNUniqueId();
233 String writeFieldName = seseEffectsKey.getFieldDescriptor();
235 if(writeFieldName.length()>0){
236 HashSet<HeapRegionNode> stallSiteHRNSet = nodeA.getHRNSet();
237 for (Iterator iterator = stallSiteHRNSet.iterator(); iterator
239 HeapRegionNode stallHRN = (HeapRegionNode) iterator.next();
240 if (stallHRN.getGloballyUniqueIdentifier().equals(
241 writeHeapRegionID)) {
243 // check whether there are read or write effects of
246 HashSet<Effect> effectSet = stallSite.getEffectSet();
247 for (Iterator iterator2 = effectSet.iterator(); iterator2
249 Effect effect = (Effect) iterator2.next();
250 String stallEffectfieldName = effect.getField();
252 if (stallEffectfieldName.equals(writeFieldName)) {
253 result = result | true;
262 HashSet<Effect> effectSet = stallSite.getEffectSet();
263 for (Iterator iterator2 = effectSet.iterator(); iterator2
265 Effect effect = (Effect) iterator2.next();
266 String stallEffectfieldName = effect.getField();
268 if (stallEffectfieldName.length()==0 && nodeB.getTempDescriptor().equals(nodeA.getStallSite().getTdA())) {
269 result = result | true;
279 if (readEffectsSet != null) {
280 Iterator<SESEEffectsKey> readIter = readEffectsSet.iterator();
281 while (readIter.hasNext()) {
283 SESEEffectsKey seseEffectsKey = (SESEEffectsKey) readIter
285 String readHeapRegionID = seseEffectsKey.getHRNUniqueId();
286 String readFieldName = seseEffectsKey.getFieldDescriptor();
288 if(readFieldName.length()>0){
289 HashSet<HeapRegionNode> stallSiteHRNSet = nodeA.getHRNSet();
290 for (Iterator iterator = stallSiteHRNSet.iterator(); iterator
292 HeapRegionNode stallHRN = (HeapRegionNode) iterator.next();
293 if (stallHRN.getGloballyUniqueIdentifier().equals(
296 HashSet<Effect> effectSet = stallSite.getEffectSet();
297 for (Iterator iterator2 = effectSet.iterator(); iterator2
299 Effect effect = (Effect) iterator2.next();
300 String stallEffectfieldName = effect.getField();
302 if (effect.getEffectType().equals(
303 StallSite.WRITE_EFFECT)) {
304 if (stallEffectfieldName.equals(readFieldName)) {
305 result = result | true;
316 HashSet<Effect> effectSet = stallSite.getEffectSet();
317 for (Iterator iterator2 = effectSet.iterator(); iterator2
319 Effect effect = (Effect) iterator2.next();
320 String stallEffectfieldName = effect.getField();
322 if (effect.getEffectType().equals(
323 StallSite.WRITE_EFFECT)) {
324 if (stallEffectfieldName.length()==0 && nodeB.getTempDescriptor().equals(nodeA.getStallSite().getTdA())) {
325 result = result | true;
340 private int determineWriteConflictsType(LiveInNode liveInNodeA,
341 LiveInNode liveInNodeB) {
343 Set<HeapRegionNode> liveInHrnSetA = liveInNodeA.getHRNSet();
344 Set<HeapRegionNode> liveInHrnSetB = liveInNodeB.getHRNSet();
346 boolean isPointingToSameRegion = compareHRNSet(liveInHrnSetA,
349 boolean isSharingReachability = false;
351 Set<Set> liveInNodeReachabilitySetA = liveInNodeA.getReachabilitySet();
352 Set<Set> liveInNodeReachabilitySetB = liveInNodeB.getReachabilitySet();
354 Set<GloballyUniqueTokenTuple> overlappedReachableRegionSet = calculateOverlappedReachableRegion(
355 liveInNodeReachabilitySetA, liveInNodeReachabilitySetB);
356 if (overlappedReachableRegionSet.size() > 0) {
357 isSharingReachability = true;
360 if (isPointingToSameRegion && isSharingReachability) {
361 // two node share same reachability and points to same region, then
362 // it is fine grain conflicts
363 return ConflictEdge.FINE_GRAIN_EDGE;
364 } else if (isSharingReachability) {
365 // two node share same reachability but points to different region,
366 // then it is coarse grain conflicts
367 return ConflictEdge.COARSE_GRAIN_EDGE;
369 // otherwise, it is not write conflicts
370 return ConflictEdge.NON_WRITE_CONFLICT;
375 private boolean compareHRNSet(Set<HeapRegionNode> setA,
376 Set<HeapRegionNode> setB) {
378 for (Iterator iterator = setA.iterator(); iterator.hasNext();) {
379 HeapRegionNode heapRegionNode = (HeapRegionNode) iterator.next();
380 String gID = heapRegionNode.getGloballyUniqueIdentifier();
381 boolean found = false;
382 for (Iterator iterator2 = setB.iterator(); iterator2.hasNext();) {
383 HeapRegionNode heapRegionNode2 = (HeapRegionNode) iterator2
385 if (heapRegionNode2.getGloballyUniqueIdentifier().equals(gID)) {
396 private int determineWriteConflictsType(StallSiteNode stallNode,
397 LiveInNode liveInNode) {
399 Set<HeapRegionNode> stallHrnSet = stallNode.getHRNSet();
400 Set<HeapRegionNode> liveInHrnSet = liveInNode.getHRNSet();
402 boolean isPointingToSameRegion = compareHRNSet(stallHrnSet,
405 boolean isSharingReachability = false;
407 Set<Set> stallNodeReachabilitySet = stallNode.getReachabilitySet();
408 Set<Set> liveInNodeReachabilitySet = liveInNode.getReachabilitySet();
410 Set<GloballyUniqueTokenTuple> overlappedReachableRegionSet = calculateOverlappedReachableRegion(
411 stallNodeReachabilitySet, liveInNodeReachabilitySet);
412 if (overlappedReachableRegionSet.size() > 0) {
413 isSharingReachability = true;
416 if (isPointingToSameRegion && isSharingReachability) {
417 // two node share same reachability and points to same region, then
418 // it is fine grain conflicts
419 return ConflictEdge.FINE_GRAIN_EDGE;
420 } else if (isSharingReachability) {
421 // two node share same reachability but points to different region,
422 // then it is coarse grain conflicts
423 return ConflictEdge.COARSE_GRAIN_EDGE;
425 // otherwise, it is not write conflicts
426 return ConflictEdge.NON_WRITE_CONFLICT;
431 private boolean hasStrongUpdate(SESEEffectsKey writeEffect,
432 Set<SESEEffectsKey> strongUpdateSet) {
434 if(strongUpdateSet!=null){
435 Iterator<SESEEffectsKey> strongUpdateIter = strongUpdateSet.iterator();
436 while (strongUpdateIter.hasNext()) {
437 SESEEffectsKey strongEffect = (SESEEffectsKey) strongUpdateIter
440 if (strongEffect.getHRNUniqueId().equals(
441 writeEffect.getHRNUniqueId())
442 && strongEffect.getFieldDescriptor().equals(
443 writeEffect.getFieldDescriptor())) {
452 private boolean isWriteConflicts(LiveInNode nodeA, LiveInNode nodeB) {
454 Set<SESEEffectsKey> readEffectsSetA = nodeA.getReadEffectsSet();
455 Set<SESEEffectsKey> writeEffectsSetA = nodeA.getWriteEffectsSet();
456 Set<SESEEffectsKey> strongUpdateSetA = nodeA.getStrongUpdateSet();
458 Set<SESEEffectsKey> readEffectsSetB = nodeB.getReadEffectsSet();
459 Set<SESEEffectsKey> writeEffectsSetB = nodeB.getWriteEffectsSet();
460 Set<SESEEffectsKey> strongUpdateSetB = nodeB.getStrongUpdateSet();
462 System.out.println("nodeA="+nodeA);
463 System.out.println("readEffectsSetA="+readEffectsSetA);
464 System.out.println("writeEffectsSetA="+writeEffectsSetA);
465 System.out.println("strongUpdateSetA="+strongUpdateSetA);
466 System.out.println("nodeB="+nodeB);
467 System.out.println("readEffectsSetB="+readEffectsSetB);
468 System.out.println("writeEffectsSetB="+writeEffectsSetB);
469 System.out.println("strongUpdateSetB="+strongUpdateSetB);
470 System.out.println("--");
473 // if node A has write effects on reading/writing regions of node B
474 if (writeEffectsSetA != null) {
475 Iterator<SESEEffectsKey> writeIterA = writeEffectsSetA.iterator();
476 while (writeIterA.hasNext()) {
477 SESEEffectsKey seseEffectsKey = (SESEEffectsKey) writeIterA
480 // if (!hasStrongUpdate(seseEffectsKey, strongUpdateSetA)) {
482 String writeHeapRegionID = seseEffectsKey.getHRNUniqueId();
483 String writeFieldName = seseEffectsKey.getFieldDescriptor();
485 if (readEffectsSetB != null) {
486 Iterator<SESEEffectsKey> readIterB = readEffectsSetB
488 while (readIterB.hasNext()) {
489 SESEEffectsKey readingEffect = (SESEEffectsKey) readIterB
492 if (readingEffect.getHRNUniqueId().equals(
494 && readingEffect.getFieldDescriptor()
495 .equals(writeFieldName)) {
501 if (writeEffectsSetB != null) {
502 Iterator<SESEEffectsKey> writeIterB = writeEffectsSetB
504 while (writeIterB.hasNext()) {
505 SESEEffectsKey writingEffect = (SESEEffectsKey) writeIterB
508 if (writingEffect.getHRNUniqueId().equals(
510 && writingEffect.getFieldDescriptor()
511 .equals(writeFieldName)) {
517 // } // end of if(hasStrong)
522 // if node B has write effects on reading regions of node A
523 if (writeEffectsSetB != null) {
524 Iterator<SESEEffectsKey> writeIterB = writeEffectsSetB.iterator();
525 while (writeIterB.hasNext()) {
526 SESEEffectsKey seseEffectsKey = (SESEEffectsKey) writeIterB
529 //if (!hasStrongUpdate(seseEffectsKey, strongUpdateSetB)) {
531 String writeHeapRegionID = seseEffectsKey.getHRNUniqueId();
532 String writeFieldName = seseEffectsKey.getFieldDescriptor();
534 if (readEffectsSetA != null) {
535 Iterator<SESEEffectsKey> readIterA = readEffectsSetA
537 while (readIterA.hasNext()) {
538 SESEEffectsKey readingEffect = (SESEEffectsKey) readIterA
540 if (readingEffect.getHRNUniqueId().equals(
542 && readingEffect.getFieldDescriptor()
543 .equals(writeFieldName)) {
549 if (writeEffectsSetA != null) {
550 Iterator<SESEEffectsKey> writeIterA = writeEffectsSetA
552 while (writeIterA.hasNext()) {
553 SESEEffectsKey writingEffect = (SESEEffectsKey) writeIterA
555 if (writingEffect.getHRNUniqueId().equals(
557 && writingEffect.getFieldDescriptor()
558 .equals(writeFieldName)) {
570 private boolean isSelfConflicted(LiveInNode liveInNode) {
572 int strongUpdateCount = 0;
574 if (liveInNode.getWriteEffectsSet() != null
575 && liveInNode.getWriteEffectsSet().size() > 0) {
577 Set<SESEEffectsKey> strongUpdateSet = liveInNode
578 .getStrongUpdateSet();
580 Iterator<SESEEffectsKey> writeIter = liveInNode
581 .getWriteEffectsSet().iterator();
582 while (writeIter.hasNext()) {
583 SESEEffectsKey writeEffect = (SESEEffectsKey) writeIter.next();
584 if (hasStrongUpdate(writeEffect, strongUpdateSet)) {
588 if(writeEffect.isStrong()){
594 if (liveInNode.getWriteEffectsSet().size() == strongUpdateCount) {
605 public void analyzePossibleConflicts(Set<String> analyzedIDSet,
606 ConflictNode currentNode) {
608 // compare with all nodes
610 // examine the case where self-edge exists
611 if (currentNode instanceof LiveInNode) {
612 LiveInNode liveInNode = (LiveInNode) currentNode;
613 // if (liveInNode.getWriteEffectsSet() != null
614 // && liveInNode.getWriteEffectsSet().size() > 0) {
615 // addConflictEdge(ConflictEdge.FINE_GRAIN_EDGE, currentNode,
618 if(isSelfConflicted(liveInNode)){
619 addConflictEdge(ConflictEdge.FINE_GRAIN_EDGE, currentNode,
625 Set<Entry<String, ConflictNode>> set = id2cn.entrySet();
626 for (Iterator iterator = set.iterator(); iterator.hasNext();) {
627 Entry<String, ConflictNode> entry = (Entry<String, ConflictNode>) iterator
630 String entryNodeID = entry.getKey();
631 ConflictNode entryNode = entry.getValue();
633 if ((!currentNode.getID().equals(entryNodeID))
634 && !(analyzedIDSet.contains(currentNode.getID()
635 + entryNodeID) || analyzedIDSet
636 .contains(entryNodeID + currentNode.getID()))) {
638 if (currentNode instanceof StallSiteNode
639 && entryNode instanceof LiveInNode) {
640 if (isWriteConflicts((StallSiteNode) currentNode,
641 (LiveInNode) entryNode)) {
642 int conflictType = determineWriteConflictsType(
643 (StallSiteNode) currentNode,
644 (LiveInNode) entryNode);
645 if (conflictType > 0) {
646 addConflictEdge(conflictType, currentNode,
650 analyzedIDSet.add(currentNode.getID() + entryNodeID);
652 } else if (currentNode instanceof LiveInNode
653 && entryNode instanceof LiveInNode) {
654 if (isWriteConflicts((LiveInNode) currentNode,
655 (LiveInNode) entryNode)) {
657 int conflictType = determineWriteConflictsType(
658 (LiveInNode) currentNode,
659 (LiveInNode) entryNode);
660 if (conflictType > 0) {
661 addConflictEdge(conflictType, currentNode,
666 analyzedIDSet.add(currentNode.getID() + entryNodeID);
675 public boolean containsTokenTuple(Set<GloballyUniqueTokenTuple> overlapSet,
678 for (Iterator iterator = overlapSet.iterator(); iterator.hasNext();) {
679 GloballyUniqueTokenTuple globallyUniqueTokenTuple = (GloballyUniqueTokenTuple) iterator
681 if (globallyUniqueTokenTuple.getID().equals(uniqueID)) {
690 private Set<GloballyUniqueTokenTuple> calculateOverlappedReachableRegion(
691 Set<Set> setA, Set<Set> setB) {
693 Set<GloballyUniqueTokenTuple> returnSet = new HashSet<GloballyUniqueTokenTuple>();
695 for (Iterator iterator2 = setA.iterator(); iterator2.hasNext();) {
696 Set tokenTupleSetA = (Set) iterator2.next();
698 for (Iterator iterator3 = setB.iterator(); iterator3.hasNext();) {
699 Set tokenTupleSetB = (Set) iterator3.next();
701 if (tokenTupleSetA.equals(tokenTupleSetB)) {
702 // reachability states are overlapped
703 Iterator ttsIter = tokenTupleSetA.iterator();
704 while (ttsIter.hasNext()) {
705 GloballyUniqueTokenTuple tt = (GloballyUniqueTokenTuple) ttsIter
715 public String addStallNode(TempDescriptor td, FlatMethod fm,
716 StallSite stallSite, Set<Set> reachabilitySet) {
718 String stallNodeID = td + "_" + fm.getMethod().getSymbol();
720 if (!id2cn.containsKey(stallNodeID)) {
721 StallSiteNode newNode = new StallSiteNode(stallNodeID, td,
722 stallSite, reachabilitySet);
723 id2cn.put(stallNodeID, newNode);
724 // it add new new stall node to conflict graph
727 // it doesn't add new stall node because stall node has already been
732 public StallSiteNode getStallNode(String stallNodeID) {
733 ConflictNode node = id2cn.get(stallNodeID);
734 if (node instanceof StallSiteNode) {
735 return (StallSiteNode) node;
741 public void addLiveInNode(TempDescriptor td, Set<HeapRegionNode> hrnSet,
742 FlatSESEEnterNode fsen, Set<SESEEffectsKey> readEffectsSet,
743 Set<SESEEffectsKey> writeEffectsSet,
744 Set<SESEEffectsKey> strongUpdateSet, Set<Set> reachabilitySet) {
746 String liveinNodeID = td + "_" + fsen.getIdentifier();
748 LiveInNode newNode = new LiveInNode(liveinNodeID, td, hrnSet,
749 readEffectsSet, writeEffectsSet, strongUpdateSet,
750 reachabilitySet, fsen.getIdentifier());
751 id2cn.put(liveinNodeID, newNode);
755 public void addConflictEdge(int type, ConflictNode nodeU, ConflictNode nodeV) {
757 ConflictEdge newEdge = new ConflictEdge(nodeU, nodeV, type);
758 nodeU.addEdge(newEdge);
759 nodeV.addEdge(newEdge);
763 public HashSet<LiveInNode> getLiveInNodeSet() {
764 HashSet<LiveInNode> resultSet = new HashSet<LiveInNode>();
766 Set<String> keySet = id2cn.keySet();
767 for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
768 String key = (String) iterator.next();
769 ConflictNode node = id2cn.get(key);
771 if (node instanceof LiveInNode) {
772 resultSet.add((LiveInNode) node);
779 public Set<WaitingElement> getStallSiteWaitingElementSet(
780 ParentChildConflictsMap conflictsMap, HashSet<SESELock> seseLockSet) {
782 HashSet<WaitingElement> waitingElementSet = new HashSet<WaitingElement>();
783 Set<Entry<String, ConflictNode>> s = id2cn.entrySet();
784 Collection<StallSite> stallSites = conflictsMap.getStallMap().values();
786 for (Iterator iterator = stallSites.iterator(); iterator.hasNext();) {
788 StallSite stallSite = (StallSite) iterator.next();
789 Iterator<Entry<String, ConflictNode>> i = s.iterator();
790 while (i.hasNext()) {
791 Entry<String, ConflictNode> entry = i.next();
792 ConflictNode node = entry.getValue();
794 if (node instanceof StallSiteNode) {
795 StallSiteNode stallSiteNode = (StallSiteNode) node;
796 if (stallSiteNode.getStallSite().equals(stallSite)) {
797 HashSet<ConflictEdge> edgeSet = stallSiteNode
799 for (Iterator iter2 = edgeSet.iterator(); iter2
801 ConflictEdge conflictEdge = (ConflictEdge) iter2
805 HashSet<Integer> allocSet = new HashSet<Integer>();
807 if (conflictEdge.getType() == ConflictEdge.COARSE_GRAIN_EDGE) {
808 if (isReadOnly(node)) {
809 type = 2; // coarse read
811 type = 3; // coarse write
814 allocSet.addAll(getAllocSet(conflictEdge
816 allocSet.addAll(getAllocSet(conflictEdge
819 } else if (conflictEdge.getType() == ConflictEdge.FINE_GRAIN_EDGE) {// it
823 allocSet.addAll(getAllocSet(node));
824 if (isReadOnly(node)) {
834 for (Iterator<SESELock> seseLockIter = seseLockSet
835 .iterator(); seseLockIter.hasNext();) {
836 SESELock seseLock = seseLockIter.next();
838 .containsConflictNode(stallSiteNode)) {
839 WaitingElement newElement = new WaitingElement();
840 newElement.setAllocList(allocSet);
841 newElement.setWaitingID(seseLock
843 newElement.setStatus(type);
844 waitingElementSet.add(newElement);
856 return waitingElementSet;
859 public Set<Integer> getConnectedConflictNodeSet(
860 ParentChildConflictsMap conflictsMap) {
862 HashSet<Integer> nodeIDSet = new HashSet<Integer>();
864 Set<Entry<String, ConflictNode>> s = id2cn.entrySet();
866 Collection<StallSite> stallSites = conflictsMap.getStallMap().values();
867 for (Iterator iterator = stallSites.iterator(); iterator.hasNext();) {
868 StallSite stallSite = (StallSite) iterator.next();
869 Iterator<Entry<String, ConflictNode>> i = s.iterator();
870 while (i.hasNext()) {
871 Entry<String, ConflictNode> entry = i.next();
872 ConflictNode node = entry.getValue();
874 if (node instanceof StallSiteNode) {
875 StallSiteNode stallSiteNode = (StallSiteNode) node;
876 if (stallSiteNode.getStallSite().equals(stallSite)) {
877 HashSet<ConflictEdge> edgeSet = stallSiteNode
879 for (Iterator iter2 = edgeSet.iterator(); iter2
881 ConflictEdge conflictEdge = (ConflictEdge) iter2
884 .addAll(getConnectedConflictNode(conflictEdge));
895 private Set<Integer> getConnectedConflictNode(ConflictEdge conflictEdge) {
897 HashSet<Integer> nodeIDSet = new HashSet<Integer>();
899 if (conflictEdge.getVertexU() instanceof LiveInNode) {
900 LiveInNode lin = (LiveInNode) conflictEdge.getVertexU();
901 nodeIDSet.add(new Integer(lin.getSESEIdentifier()));
903 if (conflictEdge.getVertexV() instanceof LiveInNode) {
904 LiveInNode lin = (LiveInNode) conflictEdge.getVertexV();
905 nodeIDSet.add(new Integer(lin.getSESEIdentifier()));
911 private Set<Integer> getConnectedConflictNode(ConflictEdge conflictEdge,
914 HashSet<Integer> nodeIDSet = new HashSet<Integer>();
916 if (conflictEdge.getVertexU() instanceof LiveInNode) {
917 LiveInNode lin = (LiveInNode) conflictEdge.getVertexU();
918 if (lin.getSESEIdentifier() != seseID) {
919 nodeIDSet.add(new Integer(lin.getSESEIdentifier()));
923 nodeIDSet.add(new Integer(-1));
925 if (conflictEdge.getVertexV() instanceof LiveInNode) {
926 LiveInNode lin = (LiveInNode) conflictEdge.getVertexV();
927 if (lin.getSESEIdentifier() != seseID) {
928 nodeIDSet.add(new Integer(lin.getSESEIdentifier()));
932 nodeIDSet.add(new Integer(-1));
936 if (conflictEdge.getVertexU() instanceof LiveInNode
937 && conflictEdge.getVertexV() instanceof LiveInNode) {
938 if (((LiveInNode) conflictEdge.getVertexU()).getSESEIdentifier() == seseID
939 && ((LiveInNode) conflictEdge.getVertexV())
940 .getSESEIdentifier() == seseID) {
941 nodeIDSet.add(seseID);
948 public Set<Integer> getConnectedConflictNodeSet(int seseID) {
950 HashSet<Integer> nodeIDSet = new HashSet<Integer>();
952 Set<Entry<String, ConflictNode>> s = id2cn.entrySet();
953 Iterator<Entry<String, ConflictNode>> i = s.iterator();
955 while (i.hasNext()) {
956 Entry<String, ConflictNode> entry = i.next();
957 ConflictNode node = entry.getValue();
959 if (node instanceof LiveInNode) {
960 LiveInNode liveInNode = (LiveInNode) node;
961 if (liveInNode.getSESEIdentifier() == seseID) {
962 HashSet<ConflictEdge> edgeSet = liveInNode.getEdgeSet();
963 for (Iterator iterator = edgeSet.iterator(); iterator
965 ConflictEdge conflictEdge = (ConflictEdge) iterator
968 nodeIDSet.addAll(getConnectedConflictNode(conflictEdge,
980 public Set<WaitingElement> getWaitingElementSetBySESEID(int seseID,
981 HashSet<SESELock> seseLockSet) {
983 HashSet<WaitingElement> waitingElementSet = new HashSet<WaitingElement>();
985 Set<Entry<String, ConflictNode>> s = id2cn.entrySet();
986 Iterator<Entry<String, ConflictNode>> i = s.iterator();
988 while (i.hasNext()) {
989 Entry<String, ConflictNode> entry = i.next();
990 ConflictNode node = entry.getValue();
992 if (node instanceof LiveInNode) {
993 LiveInNode liveInNode = (LiveInNode) node;
994 if (liveInNode.getSESEIdentifier() == seseID) {
996 HashSet<ConflictEdge> edgeSet = liveInNode.getEdgeSet();
998 for (Iterator iterator = edgeSet.iterator(); iterator
1000 ConflictEdge conflictEdge = (ConflictEdge) iterator
1003 HashSet<Integer> allocSet = new HashSet<Integer>();
1005 if (conflictEdge.getType() == ConflictEdge.COARSE_GRAIN_EDGE) {
1006 if (isReadOnly(node)) {
1007 type = 2; // coarse read
1009 type = 3; // coarse write
1012 allocSet.addAll(getAllocSet(conflictEdge
1014 allocSet.addAll(getAllocSet(conflictEdge
1017 } else if (conflictEdge.getType() == ConflictEdge.FINE_GRAIN_EDGE) {// it
1021 allocSet.addAll(getAllocSet(node));
1022 if (isReadOnly(node)) {
1033 for (Iterator<SESELock> seseLockIter = seseLockSet
1034 .iterator(); seseLockIter.hasNext();) {
1035 SESELock seseLock = seseLockIter.next();
1036 if (seseLock.containsConflictNode(liveInNode)) {
1037 WaitingElement newElement = new WaitingElement();
1038 newElement.setAllocList(allocSet);
1039 newElement.setWaitingID(seseLock.getID());
1040 newElement.setStatus(type);
1041 if(!waitingElementSet.contains(newElement)){
1042 waitingElementSet.add(newElement);
1057 return waitingElementSet;
1060 public Set<Long> getAllocationSiteIDSetBySESEID(int seseID) {
1062 HashSet<Long> allocSiteIDSet = new HashSet<Long>();
1064 Set<Entry<String, ConflictNode>> s = id2cn.entrySet();
1065 Iterator<Entry<String, ConflictNode>> i = s.iterator();
1067 while (i.hasNext()) {
1068 Entry<String, ConflictNode> entry = i.next();
1069 ConflictNode node = entry.getValue();
1071 if (node instanceof LiveInNode) {
1072 LiveInNode liveInNode = (LiveInNode) node;
1073 if (liveInNode.getSESEIdentifier() == seseID) {
1074 HashSet<ConflictEdge> edgeSet = liveInNode.getEdgeSet();
1075 for (Iterator iterator = edgeSet.iterator(); iterator
1077 ConflictEdge conflictEdge = (ConflictEdge) iterator
1080 getConnectedConflictNode(conflictEdge, seseID);
1082 if (conflictEdge.getType() == ConflictEdge.COARSE_GRAIN_EDGE) {
1084 .addAll(getHRNIdentifierSet(conflictEdge
1087 .addAll(getHRNIdentifierSet(conflictEdge
1089 } else {// it is fine-grain edge
1090 allocSiteIDSet.addAll(getHRNIdentifierSet(node));
1098 return allocSiteIDSet;
1102 public Set<Long> getAllocationSiteIDSetofStallSite() {
1104 HashSet<Long> allocSiteIDSet = new HashSet<Long>();
1106 Set<Entry<String, ConflictNode>> s = id2cn.entrySet();
1107 Iterator<Entry<String, ConflictNode>> i = s.iterator();
1109 while (i.hasNext()) {
1111 Entry<String, ConflictNode> entry = i.next();
1112 ConflictNode node = entry.getValue();
1114 if (node instanceof StallSiteNode) {
1115 allocSiteIDSet.addAll(getHRNIdentifierSet(node));
1120 return allocSiteIDSet;
1124 public Set<Long> getAllocationSiteIDSet() {
1126 HashSet<Long> allocSiteIDSet = new HashSet<Long>();
1128 Set<Entry<String, ConflictNode>> s = id2cn.entrySet();
1129 Iterator<Entry<String, ConflictNode>> i = s.iterator();
1131 while (i.hasNext()) {
1132 Entry<String, ConflictNode> entry = i.next();
1133 ConflictNode node = entry.getValue();
1135 HashSet<ConflictEdge> edgeSet = node.getEdgeSet();
1136 for (Iterator iterator = edgeSet.iterator(); iterator.hasNext();) {
1137 ConflictEdge conflictEdge = (ConflictEdge) iterator.next();
1138 if (conflictEdge.getType() == ConflictEdge.COARSE_GRAIN_EDGE) {
1139 allocSiteIDSet.addAll(getHRNIdentifierSet(conflictEdge
1141 allocSiteIDSet.addAll(getHRNIdentifierSet(conflictEdge
1143 } else {// it is fine-grain edge
1144 allocSiteIDSet.addAll(getHRNIdentifierSet(node));
1150 return allocSiteIDSet;
1154 private HashSet<Integer> getAllocSet(ConflictNode node) {
1156 HashSet<Integer> returnSet = new HashSet<Integer>();
1158 if (node instanceof StallSiteNode) {
1159 StallSiteNode stallSiteNode = (StallSiteNode) node;
1160 Set<HeapRegionNode> hrnSet = stallSiteNode.getHRNSet();
1161 for (Iterator iterator = hrnSet.iterator(); iterator.hasNext();) {
1162 HeapRegionNode hrn = (HeapRegionNode) iterator.next();
1163 // allocSiteIDSet.add(hrn.getGloballyUniqueIdentifier());
1164 if (hrn.getAllocationSite() != null) {
1165 returnSet.add(new Integer(hrn.getAllocationSite().getID()));
1169 LiveInNode liveInNode = (LiveInNode) node;
1170 Set<HeapRegionNode> hrnSet = liveInNode.getHRNSet();
1171 for (Iterator iterator = hrnSet.iterator(); iterator.hasNext();) {
1172 HeapRegionNode hrn = (HeapRegionNode) iterator.next();
1173 // allocSiteIDSet.add(hrn.getGloballyUniqueIdentifier());
1174 if (hrn.getAllocationSite() != null) {
1175 returnSet.add(new Integer(hrn.getAllocationSite().getID()));
1177 returnSet.add(new Integer(hrn.getID()));
1185 private HashSet<Long> getHRNIdentifierSet(ConflictNode node) {
1187 HashSet<Long> returnSet = new HashSet<Long>();
1189 if (node instanceof StallSiteNode) {
1190 StallSiteNode stallSiteNode = (StallSiteNode) node;
1191 Set<HeapRegionNode> hrnSet = stallSiteNode.getHRNSet();
1192 for (Iterator iterator = hrnSet.iterator(); iterator.hasNext();) {
1193 HeapRegionNode hrn = (HeapRegionNode) iterator.next();
1194 // allocSiteIDSet.add(hrn.getGloballyUniqueIdentifier());
1196 .add(new Long(hrn.getGloballyUniqueIntegerIdentifier()));
1199 LiveInNode liveInNode = (LiveInNode) node;
1200 Set<HeapRegionNode> hrnSet = liveInNode.getHRNSet();
1201 for (Iterator iterator = hrnSet.iterator(); iterator.hasNext();) {
1202 HeapRegionNode hrn = (HeapRegionNode) iterator.next();
1203 // allocSiteIDSet.add(hrn.getGloballyUniqueIdentifier());
1205 .add(new Long(hrn.getGloballyUniqueIntegerIdentifier()));
1213 public HashSet<ConflictEdge> getEdgeSet() {
1215 HashSet<ConflictEdge> returnSet = new HashSet<ConflictEdge>();
1217 Collection<ConflictNode> nodes = id2cn.values();
1218 for (Iterator iterator = nodes.iterator(); iterator.hasNext();) {
1219 ConflictNode conflictNode = (ConflictNode) iterator.next();
1220 returnSet.addAll(conflictNode.getEdgeSet());
1226 static public int generateUniqueCliqueID() {
1227 ++uniqueCliqueIDcount;
1228 return uniqueCliqueIDcount;
1231 public void writeGraph(String graphName, boolean filter)
1232 throws java.io.IOException {
1234 graphName = graphName.replaceAll("[\\W]", "");
1236 BufferedWriter bw = new BufferedWriter(new FileWriter(graphName
1238 bw.write("graph " + graphName + " {\n");
1240 HashSet<HeapRegionNode> visited = new HashSet<HeapRegionNode>();
1241 // then visit every heap region node
1242 Set<Entry<String, ConflictNode>> s = id2cn.entrySet();
1243 Iterator<Entry<String, ConflictNode>> i = s.iterator();
1245 HashSet<ConflictEdge> addedSet = new HashSet<ConflictEdge>();
1247 while (i.hasNext()) {
1248 Entry<String, ConflictNode> entry = i.next();
1249 ConflictNode node = entry.getValue();
1252 if (node.getID().startsWith("___dst")
1253 || node.getID().startsWith("___srctmp")
1254 || node.getID().startsWith("___neverused")
1255 || node.getID().startsWith("___temp")) {
1261 String attributes = "[";
1263 attributes += "label=\"ID" + node.getID() + "\\n";
1265 if (node instanceof StallSiteNode) {
1266 attributes += "STALL SITE" + "\\n" + "\"]";
1268 attributes += "LIVE-IN" + "\\n" + "\"]";
1270 bw.write(entry.getKey() + attributes + ";\n");
1272 HashSet<ConflictEdge> edgeSet = node.getEdgeSet();
1273 for (Iterator iterator = edgeSet.iterator(); iterator.hasNext();) {
1274 ConflictEdge conflictEdge = (ConflictEdge) iterator.next();
1276 ConflictNode u = conflictEdge.getVertexU();
1277 ConflictNode v = conflictEdge.getVertexV();
1280 String uID = u.getID();
1281 String vID = v.getID();
1282 if (uID.startsWith("___dst") || uID.startsWith("___srctmp")
1283 || uID.startsWith("___neverused")
1284 || uID.startsWith("___temp")
1285 || vID.startsWith("___dst")
1286 || vID.startsWith("___srctmp")
1287 || vID.startsWith("___neverused")
1288 || vID.startsWith("___temp")) {
1293 if (!addedSet.contains(conflictEdge)) {
1294 bw.write(" " + u.getID() + "--" + v.getID() + "[label="
1295 + conflictEdge.toGraphEdgeString()
1297 addedSet.add(conflictEdge);
1303 bw.write(" graphTitle[label=\"" + graphName + "\",shape=box];\n");
1312 class ConflictEdge {
1314 private ConflictNode u;
1315 private ConflictNode v;
1318 public static final int NON_WRITE_CONFLICT = 0;
1319 public static final int FINE_GRAIN_EDGE = 1;
1320 public static final int COARSE_GRAIN_EDGE = 2;
1321 public static final int PSEUDO_EDGE = 3;
1323 public ConflictEdge(ConflictNode u, ConflictNode v, int type) {
1329 public String toGraphEdgeString() {
1330 if (type == FINE_GRAIN_EDGE) {
1331 return "\"F_CONFLICT\"";
1332 } else if (type == COARSE_GRAIN_EDGE) {
1333 return "\"C_CONFLICT\"";
1334 } else if (type == PSEUDO_EDGE) {
1335 return "\"P_CONFLICT\", style=dotted";
1337 return "CONFLICT\"";
1341 public ConflictNode getVertexU() {
1345 public ConflictNode getVertexV() {
1349 public int getType() {