1 package Analysis.MLP;
\r
8 // This class formerly had lazy consistency properties, but
\r
9 // it is being changed so that the full set and the extra
\r
10 // hash tables to access the full set efficiently by different
\r
11 // elements will be consistent after EVERY operation. Also,
\r
12 // a consistent assert method allows a debugger to ask whether
\r
13 // an operation has produced an inconsistent VarSrcTokTable.
\r
14 public class VarSrcTokTable {
\r
16 // a set of every token in the table
\r
17 private HashSet<VariableSourceToken> trueSet;
\r
19 // these hashtables provide an efficient retreival from the true set
\r
20 private Hashtable< TempDescriptor, Set<VariableSourceToken> > var2vst;
\r
21 private Hashtable< FlatSESEEnterNode, Set<VariableSourceToken> > sese2vst;
\r
22 private Hashtable< SVKey, Set<VariableSourceToken> > sv2vst;
\r
24 // maximum age from aging operation
\r
25 private Integer MAX_AGE = new Integer( 2 );
\r
28 public VarSrcTokTable() {
\r
29 trueSet = new HashSet<VariableSourceToken>();
\r
31 sese2vst = new Hashtable< FlatSESEEnterNode, Set<VariableSourceToken> >();
\r
32 var2vst = new Hashtable< TempDescriptor, Set<VariableSourceToken> >();
\r
33 sv2vst = new Hashtable< SVKey, Set<VariableSourceToken> >();
\r
37 public VarSrcTokTable( VarSrcTokTable in ) {
\r
38 trueSet = (HashSet<VariableSourceToken>) in.trueSet.clone();
\r
40 Iterator itr; Set s;
\r
42 sese2vst = new Hashtable< FlatSESEEnterNode, Set<VariableSourceToken> >();
\r
43 itr = in.sese2vst.entrySet().iterator();
\r
44 while( itr.hasNext() ) {
\r
45 Map.Entry me = (Map.Entry) itr.next();
\r
46 FlatSESEEnterNode sese = (FlatSESEEnterNode) me.getKey();
\r
47 HashSet<VariableSourceToken> s1 = (HashSet<VariableSourceToken>) me.getValue();
\r
49 sese2vst.put( sese,
\r
50 (HashSet<VariableSourceToken>) (s1.clone()) );
\r
53 var2vst = new Hashtable< TempDescriptor, Set<VariableSourceToken> >();
\r
54 itr = in.var2vst.entrySet().iterator();
\r
55 while( itr.hasNext() ) {
\r
56 Map.Entry me = (Map.Entry) itr.next();
\r
57 TempDescriptor var = (TempDescriptor) me.getKey();
\r
58 HashSet<VariableSourceToken> s1 = (HashSet<VariableSourceToken>) me.getValue();
\r
61 (HashSet<VariableSourceToken>) (s1.clone()) );
\r
64 sv2vst = new Hashtable< SVKey, Set<VariableSourceToken> >();
\r
65 itr = in.sv2vst.entrySet().iterator();
\r
66 while( itr.hasNext() ) {
\r
67 Map.Entry me = (Map.Entry) itr.next();
\r
68 SVKey key = (SVKey) me.getKey();
\r
69 HashSet<VariableSourceToken> s1 = (HashSet<VariableSourceToken>) me.getValue();
\r
72 (HashSet<VariableSourceToken>) (s1.clone()) );
\r
77 public void add( VariableSourceToken vst ) {
\r
80 Set<VariableSourceToken> s;
\r
82 s = sese2vst.get( vst.getSESE() );
\r
84 s = new HashSet<VariableSourceToken>();
\r
87 sese2vst.put( vst.getSESE(), s );
\r
89 s = var2vst.get( vst.getVarLive() );
\r
91 s = new HashSet<VariableSourceToken>();
\r
94 var2vst.put( vst.getVarLive(), s );
\r
96 SVKey key = new SVKey( vst.getSESE(), vst.getVarLive() );
\r
97 s = sv2vst.get( key );
\r
99 s = new HashSet<VariableSourceToken>();
\r
102 sv2vst.put( key, s );
\r
105 public void addAll( Set<VariableSourceToken> s ) {
\r
106 Iterator<VariableSourceToken> itr = s.iterator();
\r
107 while( itr.hasNext() ) {
\r
113 public Set<VariableSourceToken> get() {
\r
117 public Set<VariableSourceToken> get( FlatSESEEnterNode sese ) {
\r
118 Set<VariableSourceToken> s = sese2vst.get( sese );
\r
120 s = new HashSet<VariableSourceToken>();
\r
121 sese2vst.put( sese, s );
\r
126 public Set<VariableSourceToken> get( TempDescriptor var ) {
\r
127 Set<VariableSourceToken> s = var2vst.get( var );
\r
129 s = new HashSet<VariableSourceToken>();
\r
130 var2vst.put( var, s );
\r
135 public Set<VariableSourceToken> get( SVKey key ) {
\r
136 Set<VariableSourceToken> s = sv2vst.get( key );
\r
138 s = new HashSet<VariableSourceToken>();
\r
139 sv2vst.put( key, s );
\r
145 public void merge( VarSrcTokTable tableIn ) {
\r
147 if( tableIn == null ) {
\r
151 // make a copy for modification to use in the merge
\r
152 VarSrcTokTable table = new VarSrcTokTable( tableIn );
\r
155 trueSet.addAll( table.trueSet );
\r
160 // merge sese2vst mappings
\r
161 itr = this.sese2vst.entrySet().iterator();
\r
162 while( itr.hasNext() ) {
\r
163 Map.Entry me = (Map.Entry) itr.next();
\r
164 FlatSESEEnterNode sese = (FlatSESEEnterNode) me.getKey();
\r
165 Set<VariableSourceToken> s1 = (Set<VariableSourceToken>) me.getValue();
\r
166 Set<VariableSourceToken> s2 = table.sese2vst.get( sese );
\r
173 itr = table.sese2vst.entrySet().iterator();
\r
174 while( itr.hasNext() ) {
\r
175 Map.Entry me = (Map.Entry) itr.next();
\r
176 FlatSESEEnterNode sese = (FlatSESEEnterNode) me.getKey();
\r
177 Set<VariableSourceToken> s2 = (Set<VariableSourceToken>) me.getValue();
\r
178 Set<VariableSourceToken> s1 = this.sese2vst.get( sese );
\r
182 this.sese2vst.put( sese, s2 );
\r
186 // merge var2vst mappings
\r
187 itr = this.var2vst.entrySet().iterator();
\r
188 while( itr.hasNext() ) {
\r
189 Map.Entry me = (Map.Entry) itr.next();
\r
190 TempDescriptor var = (TempDescriptor) me.getKey();
\r
191 Set<VariableSourceToken> s1 = (Set<VariableSourceToken>) me.getValue();
\r
192 Set<VariableSourceToken> s2 = table.var2vst.get( var );
\r
199 itr = table.var2vst.entrySet().iterator();
\r
200 while( itr.hasNext() ) {
\r
201 Map.Entry me = (Map.Entry) itr.next();
\r
202 TempDescriptor var = (TempDescriptor) me.getKey();
\r
203 Set<VariableSourceToken> s2 = (Set<VariableSourceToken>) me.getValue();
\r
204 Set<VariableSourceToken> s1 = this.var2vst.get( var );
\r
208 this.var2vst.put( var, s2 );
\r
212 // merge sv2vst mappings
\r
213 itr = this.sv2vst.entrySet().iterator();
\r
214 while( itr.hasNext() ) {
\r
215 Map.Entry me = (Map.Entry) itr.next();
\r
216 SVKey key = (SVKey) me.getKey();
\r
217 Set<VariableSourceToken> s1 = (Set<VariableSourceToken>) me.getValue();
\r
218 Set<VariableSourceToken> s2 = table.sv2vst.get( key );
\r
225 itr = table.sv2vst.entrySet().iterator();
\r
226 while( itr.hasNext() ) {
\r
227 Map.Entry me = (Map.Entry) itr.next();
\r
228 SVKey key = (SVKey) me.getKey();
\r
229 Set<VariableSourceToken> s2 = (Set<VariableSourceToken>) me.getValue();
\r
230 Set<VariableSourceToken> s1 = this.sv2vst.get( key );
\r
234 this.sv2vst.put( key, s2 );
\r
240 // remove operations must leave the trueSet
\r
241 // and the hash maps consistent!
\r
242 public void remove( VariableSourceToken vst ) {
\r
243 trueSet.remove( vst );
\r
245 Set<VariableSourceToken> s;
\r
247 s = get( vst.getSESE() );
\r
248 if( s != null ) { s.remove( vst ); }
\r
250 s = get( vst.getVarLive() );
\r
251 if( s != null ) { s.remove( vst ); }
\r
253 s = get( new SVKey( vst.getSESE(), vst.getVarLive() ) );
\r
254 if( s != null ) { s.remove( vst ); }
\r
257 public void remove( FlatSESEEnterNode sese ) {
\r
258 Set<VariableSourceToken> s = sese2vst.get( sese );
\r
263 trueSet.removeAll( s );
\r
264 sese2vst.remove( sese );
\r
266 Iterator<VariableSourceToken> itr = s.iterator();
\r
267 while( itr.hasNext() ) {
\r
268 VariableSourceToken vst = itr.next();
\r
273 public void remove( TempDescriptor var ) {
\r
274 Set<VariableSourceToken> s = var2vst.get( var );
\r
279 trueSet.removeAll( s );
\r
280 var2vst.remove( var );
\r
282 Iterator<VariableSourceToken> itr = s.iterator();
\r
283 while( itr.hasNext() ) {
\r
284 VariableSourceToken vst = itr.next();
\r
289 public void remove( FlatSESEEnterNode sese,
\r
290 TempDescriptor var ) {
\r
292 SVKey key = new SVKey( sese, var );
\r
293 Set<VariableSourceToken> s = sv2vst.get( key );
\r
298 trueSet.removeAll( s );
\r
299 sv2vst.remove( key );
\r
301 Iterator<VariableSourceToken> itr = s.iterator();
\r
302 while( itr.hasNext() ) {
\r
303 VariableSourceToken vst = itr.next();
\r
310 // return a new table based on this one and
\r
311 // age tokens with respect to SESE curr, where
\r
312 // any curr tokens increase age by 1
\r
313 public VarSrcTokTable age( FlatSESEEnterNode curr ) {
\r
315 // create a table to modify as a copy of this
\r
316 VarSrcTokTable out = new VarSrcTokTable( this );
\r
318 Iterator<VariableSourceToken> itr = trueSet.iterator();
\r
319 while( itr.hasNext() ) {
\r
320 VariableSourceToken vst = itr.next();
\r
322 if( vst.getSESE().equals( curr ) ) {
\r
324 Integer newAge = vst.getAge()+1;
\r
325 if( newAge > MAX_AGE ) {
\r
331 out.add( new VariableSourceToken( vst.getVarLive(),
\r
344 // for the given SESE, change child tokens into this parent
\r
345 public void remapChildTokens( FlatSESEEnterNode curr ) {
\r
347 Iterator<FlatSESEEnterNode> childItr = curr.getChildren().iterator();
\r
348 if( childItr.hasNext() ) {
\r
349 FlatSESEEnterNode child = childItr.next();
\r
351 Iterator<VariableSourceToken> vstItr = get( child ).iterator();
\r
352 while( vstItr.hasNext() ) {
\r
353 VariableSourceToken vst = vstItr.next();
\r
357 add( new VariableSourceToken( vst.getVarLive(),
\r
360 vst.getVarLive() ) );
\r
366 // if we can get a value from the current SESE and the parent
\r
367 // or a sibling, just getting from the current SESE suffices now
\r
368 // return a set of temps that are virtually read
\r
369 public Set<TempDescriptor> removeParentAndSiblingTokens( FlatSESEEnterNode curr,
\r
370 Set<TempDescriptor> liveIn ) {
\r
372 HashSet<TempDescriptor> virtualLiveIn = new HashSet<TempDescriptor>();
\r
374 FlatSESEEnterNode parent = curr.getParent();
\r
375 if( parent == null ) {
\r
376 // have no parent or siblings
\r
377 return virtualLiveIn;
\r
380 remove_A_if_B( parent, curr, liveIn, virtualLiveIn );
\r
382 Iterator<FlatSESEEnterNode> childItr = parent.getChildren().iterator();
\r
383 if( childItr.hasNext() ) {
\r
384 FlatSESEEnterNode child = childItr.next();
\r
386 if( !child.equals( curr ) ) {
\r
387 remove_A_if_B( child, curr, liveIn, virtualLiveIn );
\r
391 return virtualLiveIn;
\r
394 // if B is also a source for some variable, remove all entries
\r
395 // of A as a source for that variable: s is virtual reads
\r
396 protected void remove_A_if_B( FlatSESEEnterNode a,
\r
397 FlatSESEEnterNode b,
\r
398 Set<TempDescriptor> liveInCurrentSESE,
\r
399 Set<TempDescriptor> virtualLiveIn ) {
\r
401 Set<VariableSourceToken> forRemoval = new HashSet<VariableSourceToken>();
\r
403 Iterator<VariableSourceToken> vstItr = get( a ).iterator();
\r
404 while( vstItr.hasNext() ) {
\r
405 VariableSourceToken vst = vstItr.next();
\r
406 TempDescriptor varLive = vst.getVarLive();
\r
407 Set<VariableSourceToken> bSet = get( new SVKey( b, varLive ) );
\r
409 if( !bSet.isEmpty() ) {
\r
410 forRemoval.add( vst );
\r
412 // mark this variable as a virtual read as well
\r
413 //if( liveInCurrentSESE.contains( varLive ) ) { ???????????
\r
414 virtualLiveIn.add( varLive );
\r
420 System.out.println( "remove "+a.getPrettyIdentifier()+" if "+b.getPrettyIdentifier() );
\r
421 System.out.println( "THIS "+toStringPretty() );
\r
422 System.out.println( "for removal="+forRemoval );
\r
425 vstItr = forRemoval.iterator();
\r
426 while( vstItr.hasNext() ) {
\r
427 VariableSourceToken vst = vstItr.next();
\r
433 public Set<VariableSourceToken> getStallSet( FlatSESEEnterNode curr ) {
\r
435 Set<VariableSourceToken> out = new HashSet<VariableSourceToken>();
\r
437 Iterator<FlatSESEEnterNode> cItr = curr.getChildren().iterator();
\r
438 while( cItr.hasNext() ) {
\r
439 FlatSESEEnterNode child = cItr.next();
\r
440 out.addAll( get( child ) );
\r
447 // use as an aid for debugging, where true-set is checked
\r
448 // against the alternate mappings: assert that nothing is
\r
449 // missing or extra in the alternates
\r
450 public void assertConsistency() {
\r
455 Set<VariableSourceToken> trueSetByAlts = new HashSet<VariableSourceToken>();
\r
457 itr = sese2vst.entrySet().iterator();
\r
458 while( itr.hasNext() ) {
\r
459 Map.Entry me = (Map.Entry) itr.next();
\r
460 FlatSESEEnterNode sese = (FlatSESEEnterNode) me.getKey();
\r
461 HashSet<VariableSourceToken> s1 = (HashSet<VariableSourceToken>) me.getValue();
\r
464 // the trueSet should have all entries in s1
\r
465 assert trueSet.containsAll( s1 );
\r
467 // s1 should not have anything that doesn't appear in trueset
\r
468 Set<VariableSourceToken> sInt = (Set<VariableSourceToken>) s1.clone();
\r
469 sInt.removeAll( trueSet );
\r
471 assert sInt.isEmpty();
\r
473 // add s1 to a running union--at the end check if trueSet has extra
\r
474 trueSetByAlts.addAll( s1 );
\r
477 // make sure trueSet isn't too big
\r
478 assert trueSetByAlts.containsAll( trueSet );
\r
482 public boolean equals( Object o ) {
\r
487 if( !(o instanceof VarSrcTokTable) ) {
\r
491 VarSrcTokTable table = (VarSrcTokTable) o;
\r
492 return trueSet.equals( table.trueSet );
\r
495 public int hashCode() {
\r
496 return trueSet.hashCode();
\r
499 public Iterator<VariableSourceToken> iterator() {
\r
500 return trueSet.iterator();
\r
503 public String toString() {
\r
504 return "trueSet ="+trueSet.toString();
\r
507 public String toStringVerbose() {
\r
508 return "trueSet ="+trueSet.toString()+"\n"+
\r
509 "sese2vst="+sese2vst.toString()+"\n"+
\r
510 "var2vst ="+var2vst.toString()+"\n"+
\r
511 "sv2vst ="+sv2vst.toString();
\r
514 public String toStringPretty() {
\r
515 String tokHighlighter = "o";
\r
517 String str = "VarSrcTokTable\n";
\r
518 Iterator<VariableSourceToken> vstItr = trueSet.iterator();
\r
519 while( vstItr.hasNext() ) {
\r
520 str += " "+tokHighlighter+" "+vstItr.next()+"\n";
\r
525 public String toStringPrettyVerbose() {
\r
526 String tokHighlighter = "o";
\r
528 String str = "VarSrcTokTable\n";
\r
532 Iterator<VariableSourceToken> vstItr;
\r
534 str += " trueSet\n";
\r
535 vstItr = trueSet.iterator();
\r
536 while( vstItr.hasNext() ) {
\r
537 str += " "+tokHighlighter+" "+vstItr.next()+"\n";
\r
540 str += " sese2vst\n";
\r
541 itr = sese2vst.entrySet().iterator();
\r
542 while( itr.hasNext() ) {
\r
543 Map.Entry me = (Map.Entry) itr.next();
\r
544 FlatSESEEnterNode sese = (FlatSESEEnterNode) me.getKey();
\r
545 HashSet<VariableSourceToken> s1 = (HashSet<VariableSourceToken>) me.getValue();
\r
548 str += " "+sese.getPrettyIdentifier()+" -> \n";
\r
550 vstItr = s1.iterator();
\r
551 while( vstItr.hasNext() ) {
\r
552 str += " "+tokHighlighter+" "+vstItr.next()+"\n";
\r
556 str += " var2vst\n";
\r
557 itr = var2vst.entrySet().iterator();
\r
558 while( itr.hasNext() ) {
\r
559 Map.Entry me = (Map.Entry) itr.next();
\r
560 TempDescriptor var = (TempDescriptor) me.getKey();
\r
561 Set<VariableSourceToken> s1 = (Set<VariableSourceToken>) me.getValue();
\r
564 str += " "+var+" -> \n";
\r
566 vstItr = s1.iterator();
\r
567 while( vstItr.hasNext() ) {
\r
568 str += " "+tokHighlighter+" "+vstItr.next()+"\n";
\r
572 str += " sv2vst\n";
\r
573 itr = sv2vst.entrySet().iterator();
\r
574 while( itr.hasNext() ) {
\r
575 Map.Entry me = (Map.Entry) itr.next();
\r
576 SVKey key = (SVKey) me.getKey();
\r
577 Set<VariableSourceToken> s1 = (Set<VariableSourceToken>) me.getValue();
\r
580 str += " "+key+" -> \n";
\r
582 vstItr = s1.iterator();
\r
583 while( vstItr.hasNext() ) {
\r
584 str += " "+tokHighlighter+" "+vstItr.next()+"\n";
\r