From: jjenista Date: Tue, 21 Apr 2009 23:27:33 +0000 (+0000) Subject: variable analysis added X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=bd9a8409e8e813c9dd3aba7854d48b7560fc58db;p=IRC.git variable analysis added --- diff --git a/Robust/src/Analysis/MLP/MLPAnalysis.java b/Robust/src/Analysis/MLP/MLPAnalysis.java index c143c518..8693ab56 100644 --- a/Robust/src/Analysis/MLP/MLPAnalysis.java +++ b/Robust/src/Analysis/MLP/MLPAnalysis.java @@ -304,8 +304,6 @@ public class MLPAnalysis { inUnion.merge( variableResults.get( nn ) ); } - System.out.println( fn+":"+seseStack ); - VarSrcTokTable curr = variable_nodeActions( fn, inUnion, seseStack.peek() ); // if a new result, schedule forward nodes for analysis @@ -313,14 +311,14 @@ public class MLPAnalysis { variableResults.put( fn, curr ); - for( int i = 0; i < fn.numPrev(); i++ ) { - FlatNode nn = fn.getPrev( i ); + for( int i = 0; i < fn.numNext(); i++ ) { + FlatNode nn = fn.getNext( i ); flatNodesToVisit.add( nn ); } } } - if( state.MLPDEBUG ) { + if( state.MLPDEBUG ) { } } @@ -331,22 +329,16 @@ public class MLPAnalysis { case FKind.FlatSESEEnterNode: { FlatSESEEnterNode fsen = (FlatSESEEnterNode) fn; - /* - if( seseStack.empty() ) { - seseRoots.add( fsen ); - } else { - seseStack.peek().addChild( fsen ); + + if( fsen.equals( currentSESE ) ) { + vstTable.age( currentSESE ); } - seseStack.push( fsen ); - */ } break; case FKind.FlatSESEExitNode: { FlatSESEExitNode fsexn = (FlatSESEExitNode) fn; - /* - assert !seseStack.empty(); - FlatSESEEnterNode fsen = seseStack.pop(); - */ + + vstTable.removeChildToks( currentSESE ); } break; case FKind.FlatOpNode: { diff --git a/Robust/src/Analysis/MLP/VarSrcTokTable.java b/Robust/src/Analysis/MLP/VarSrcTokTable.java index ef13bfac..18f4e3aa 100644 --- a/Robust/src/Analysis/MLP/VarSrcTokTable.java +++ b/Robust/src/Analysis/MLP/VarSrcTokTable.java @@ -1,266 +1,330 @@ -package Analysis.MLP; - -import IR.*; -import IR.Flat.*; -import java.util.*; -import java.io.*; - -public class VarSrcTokTable { - - // the true set represents the set of (sese, variable, age) - // triples that are truly in the table - private HashSet trueSet; - - // these hashtables provide an efficient retreival from the - // true set. Note that a particular triple from the quick - // look up must be checked against the true set--remove ops - // can cause the hashtables to be inconsistent to each other - private Hashtable< TempDescriptor, Set > var2vst; - private Hashtable< FlatSESEEnterNode, Set > sese2vst; - private Hashtable< SVKey, Set > sv2vst; - - // maximum age from aging operation - private Integer MAX_AGE = new Integer( 2 ); - - - public VarSrcTokTable() { - trueSet = new HashSet(); - - sese2vst = new Hashtable< FlatSESEEnterNode, Set >(); - var2vst = new Hashtable< TempDescriptor, Set >(); - sv2vst = new Hashtable< SVKey, Set >(); - } - - - public void add( VariableSourceToken vst ) { - trueSet.add( vst ); - - Set s; - - s = sese2vst.get( vst.getSESE() ); - if( s == null ) { - s = new HashSet(); - } - s.add( vst ); - sese2vst.put( vst.getSESE(), s ); - - s = var2vst.get( vst.getVarLive() ); - if( s == null ) { - s = new HashSet(); - } - s.add( vst ); - var2vst.put( vst.getVarLive(), s ); - - SVKey key = new SVKey( vst.getSESE(), vst.getVarLive() ); - s = sv2vst.get( key ); - if( s == null ) { - s = new HashSet(); - } - s.add( vst ); - sv2vst.put( key, s ); - } - - public void addAll( Set s ) { - Iterator itr = s.iterator(); - while( itr.hasNext() ) { - add( itr.next() ); - } - } - - - public Set get() { - return trueSet; - } - - public Set get( FlatSESEEnterNode sese ) { - Set s = sese2vst.get( sese ); - if( s == null ) { - s = new HashSet(); - sese2vst.put( sese, s ); - } - s.retainAll( trueSet ); - return s; - } - - public Set get( TempDescriptor var ) { - Set s = var2vst.get( var ); - if( s == null ) { - s = new HashSet(); - var2vst.put( var, s ); - } - s.retainAll( trueSet ); - return s; - } - - public Set get( SVKey key ) { - Set s = sv2vst.get( key ); - if( s == null ) { - s = new HashSet(); - sv2vst.put( key, s ); - } - s.retainAll( trueSet ); - return s; - } - - - public void merge( VarSrcTokTable table ) { - - if( table == null ) { - return; - } - - trueSet.addAll( table.trueSet ); - - Iterator itr; - Set s; - - itr = sese2vst.entrySet().iterator(); - while( itr.hasNext() ) { - Map.Entry me = (Map.Entry) itr.next(); - FlatSESEEnterNode sese = (FlatSESEEnterNode) me.getKey(); - Set s1 = (Set) me.getValue(); - Set s2 = table.sese2vst.get( sese ); - - assert s1 != null; - - if( s2 != null ) { - s1.addAll( s2 ); - } - } - s = table.sese2vst.entrySet(); - s.removeAll( sese2vst.entrySet() ); - sese2vst.putAll( table.sese2vst ); - - itr = var2vst.entrySet().iterator(); - while( itr.hasNext() ) { - Map.Entry me = (Map.Entry) itr.next(); - TempDescriptor var = (TempDescriptor) me.getKey(); - Set s1 = (Set) me.getValue(); - Set s2 = table.var2vst.get( var ); - - assert s1 != null; - - if( s2 != null ) { - s1.addAll( s2 ); - } - } - s = table.var2vst.entrySet(); - s.removeAll( var2vst.entrySet() ); - var2vst.putAll( table.var2vst ); - - itr = sv2vst.entrySet().iterator(); - while( itr.hasNext() ) { - Map.Entry me = (Map.Entry) itr.next(); - SVKey key = (SVKey) me.getKey(); - Set s1 = (Set) me.getValue(); - Set s2 = table.sv2vst.get( key ); - - assert s1 != null; - - if( s2 != null ) { - s1.addAll( s2 ); - } - } - s = table.sv2vst.entrySet(); - s.removeAll( sv2vst.entrySet() ); - sv2vst.putAll( table.sv2vst ); - } - - - public void remove( FlatSESEEnterNode sese ) { - Set s = sese2vst.get( sese ); - if( s == null ) { - return; - } - - trueSet.removeAll( s ); - sese2vst.remove( sese ); - } - - public void remove( TempDescriptor var ) { - Set s = var2vst.get( var ); - if( s == null ) { - return; - } - - trueSet.removeAll( s ); - var2vst.remove( var ); - } - - public void remove( FlatSESEEnterNode sese, - TempDescriptor var ) { - - SVKey key = new SVKey( sese, var ); - Set s = sv2vst.get( key ); - if( s == null ) { - return; - } - - trueSet.removeAll( s ); - sv2vst.remove( key ); - } - - public void remove( VariableSourceToken vst ) { - trueSet.remove( vst ); - } - - - // return a new table based on this one and - // age tokens with respect to SESE curr, where - // any child becomes curr with age 0, and any - // curr tokens increase age by 1 - public VarSrcTokTable age( FlatSESEEnterNode curr ) { - - VarSrcTokTable out = new VarSrcTokTable(); - /* - Iterator itr = trueSet.iterator(); - while( itr.hasNext() ) { - VariableSourceToken vst = itr.next(); - if( vst.getSESE().equals( curr ) ) { - Integer newAge = vst.getAge()+1; - if( newAge > MAX_AGE ) { - newAge = MAX_AGE; - } - out.add( new VariableSourceToken( curr, - vst.getVarLive(), - newAge ) ); - } else { - assert curr.getChildren().contains( vst.getSESE() ); - out.add( new VariableSourceToken( curr, - vst.getVarLive(), - new Integer( 1 ) ) ); - } - } - */ - return out; - } - - - public boolean equals( Object o ) { - if( o == null ) { - return false; - } - - if( !(o instanceof VarSrcTokTable) ) { - return false; - } - - VarSrcTokTable table = (VarSrcTokTable) o; - return trueSet.equals( table.trueSet ); - } - - public int hashCode() { - return trueSet.hashCode(); - } - - public Iterator iterator() { - return trueSet.iterator(); - } - - public String toString() { - return "trueSet ="+trueSet.toString()+"\n"+ - "sese2vst="+sese2vst.toString()+"\n"+ - "var2vst ="+var2vst.toString()+"\n"+ - "sv2vst ="+sv2vst.toString(); - } -} +package Analysis.MLP; + +import IR.*; +import IR.Flat.*; +import java.util.*; +import java.io.*; + +public class VarSrcTokTable { + + // the true set represents the set of (sese, variable, age) + // triples that are truly in the table + private HashSet trueSet; + + // these hashtables provide an efficient retreival from the + // true set. Note that a particular triple from the quick + // look up must be checked against the true set--remove ops + // can cause the hashtables to be inconsistent to each other + private Hashtable< TempDescriptor, Set > var2vst; + private Hashtable< FlatSESEEnterNode, Set > sese2vst; + private Hashtable< SVKey, Set > sv2vst; + + // maximum age from aging operation + private Integer MAX_AGE = new Integer( 2 ); + + + public VarSrcTokTable() { + trueSet = new HashSet(); + + sese2vst = new Hashtable< FlatSESEEnterNode, Set >(); + var2vst = new Hashtable< TempDescriptor, Set >(); + sv2vst = new Hashtable< SVKey, Set >(); + } + + + public VarSrcTokTable( VarSrcTokTable in ) { + trueSet = (HashSet) in.trueSet.clone(); + + Iterator itr; Set s; + + sese2vst = new Hashtable< FlatSESEEnterNode, Set >(); + itr = sese2vst.entrySet().iterator(); + while( itr.hasNext() ) { + Map.Entry me = (Map.Entry) itr.next(); + FlatSESEEnterNode sese = (FlatSESEEnterNode) me.getKey(); + HashSet s1 = (HashSet) me.getValue(); + assert s1 != null; + sese2vst.put( sese, + (HashSet) (s1.clone()) ); + } + + var2vst = new Hashtable< TempDescriptor, Set >(); + itr = var2vst.entrySet().iterator(); + while( itr.hasNext() ) { + Map.Entry me = (Map.Entry) itr.next(); + TempDescriptor var = (TempDescriptor) me.getKey(); + HashSet s1 = (HashSet) me.getValue(); + assert s1 != null; + var2vst.put( var, + (HashSet) (s1.clone()) ); + } + + sv2vst = new Hashtable< SVKey, Set >(); + itr = sv2vst.entrySet().iterator(); + while( itr.hasNext() ) { + Map.Entry me = (Map.Entry) itr.next(); + SVKey key = (SVKey) me.getKey(); + HashSet s1 = (HashSet) me.getValue(); + assert s1 != null; + sv2vst.put( key, + (HashSet) (s1.clone()) ); + } + } + + + public void add( VariableSourceToken vst ) { + trueSet.add( vst ); + + Set s; + + s = sese2vst.get( vst.getSESE() ); + if( s == null ) { + s = new HashSet(); + } + s.add( vst ); + sese2vst.put( vst.getSESE(), s ); + + s = var2vst.get( vst.getVarLive() ); + if( s == null ) { + s = new HashSet(); + } + s.add( vst ); + var2vst.put( vst.getVarLive(), s ); + + SVKey key = new SVKey( vst.getSESE(), vst.getVarLive() ); + s = sv2vst.get( key ); + if( s == null ) { + s = new HashSet(); + } + s.add( vst ); + sv2vst.put( key, s ); + } + + public void addAll( Set s ) { + Iterator itr = s.iterator(); + while( itr.hasNext() ) { + add( itr.next() ); + } + } + + + public Set get() { + return trueSet; + } + + public Set get( FlatSESEEnterNode sese ) { + Set s = sese2vst.get( sese ); + if( s == null ) { + s = new HashSet(); + sese2vst.put( sese, s ); + } + s.retainAll( trueSet ); + return s; + } + + public Set get( TempDescriptor var ) { + Set s = var2vst.get( var ); + if( s == null ) { + s = new HashSet(); + var2vst.put( var, s ); + } + s.retainAll( trueSet ); + return s; + } + + public Set get( SVKey key ) { + Set s = sv2vst.get( key ); + if( s == null ) { + s = new HashSet(); + sv2vst.put( key, s ); + } + s.retainAll( trueSet ); + return s; + } + + + public void merge( VarSrcTokTable table ) { + + if( table == null ) { + return; + } + + trueSet.addAll( table.trueSet ); + + Iterator itr; + Set s; + + itr = sese2vst.entrySet().iterator(); + while( itr.hasNext() ) { + Map.Entry me = (Map.Entry) itr.next(); + FlatSESEEnterNode sese = (FlatSESEEnterNode) me.getKey(); + Set s1 = (Set) me.getValue(); + Set s2 = table.sese2vst.get( sese ); + + assert s1 != null; + + if( s2 != null ) { + s1.addAll( s2 ); + } + } + s = table.sese2vst.entrySet(); + s.removeAll( sese2vst.entrySet() ); + sese2vst.putAll( table.sese2vst ); + + itr = var2vst.entrySet().iterator(); + while( itr.hasNext() ) { + Map.Entry me = (Map.Entry) itr.next(); + TempDescriptor var = (TempDescriptor) me.getKey(); + Set s1 = (Set) me.getValue(); + Set s2 = table.var2vst.get( var ); + + assert s1 != null; + + if( s2 != null ) { + s1.addAll( s2 ); + } + } + s = table.var2vst.entrySet(); + s.removeAll( var2vst.entrySet() ); + var2vst.putAll( table.var2vst ); + + itr = sv2vst.entrySet().iterator(); + while( itr.hasNext() ) { + Map.Entry me = (Map.Entry) itr.next(); + SVKey key = (SVKey) me.getKey(); + Set s1 = (Set) me.getValue(); + Set s2 = table.sv2vst.get( key ); + + assert s1 != null; + + if( s2 != null ) { + s1.addAll( s2 ); + } + } + s = table.sv2vst.entrySet(); + s.removeAll( sv2vst.entrySet() ); + sv2vst.putAll( table.sv2vst ); + } + + + public void remove( FlatSESEEnterNode sese ) { + Set s = sese2vst.get( sese ); + if( s == null ) { + return; + } + + trueSet.removeAll( s ); + sese2vst.remove( sese ); + } + + public void remove( TempDescriptor var ) { + Set s = var2vst.get( var ); + if( s == null ) { + return; + } + + trueSet.removeAll( s ); + var2vst.remove( var ); + } + + public void remove( FlatSESEEnterNode sese, + TempDescriptor var ) { + + SVKey key = new SVKey( sese, var ); + Set s = sv2vst.get( key ); + if( s == null ) { + return; + } + + trueSet.removeAll( s ); + sv2vst.remove( key ); + } + + public void remove( VariableSourceToken vst ) { + trueSet.remove( vst ); + } + + + // return a new table based on this one and + // age tokens with respect to SESE curr, where + // any child becomes curr with age 0, and any + // curr tokens increase age by 1 + public VarSrcTokTable age( FlatSESEEnterNode curr ) { + + VarSrcTokTable out = new VarSrcTokTable(); + + Iterator itr = trueSet.iterator(); + while( itr.hasNext() ) { + VariableSourceToken vst = itr.next(); + if( vst.getSESE().equals( curr ) ) { + Integer newAge = vst.getAge()+1; + if( newAge > MAX_AGE ) { + newAge = MAX_AGE; + } + out.add( new VariableSourceToken( vst.getVarLive(), + curr, + newAge, + vst.getVarSrc() + ) + ); + } + } + + return out; + } + + + // for the given SESE, remove tokens for the same live + // variable if it comes from a child SESE + public VarSrcTokTable removeChildToks( FlatSESEEnterNode curr ) { + + // create a table to modify as a copy of this + VarSrcTokTable out = new VarSrcTokTable( this ); + + // iterate over this table, modify out table + Iterator itr = get( curr ).iterator(); + while( itr.hasNext() ) { + VariableSourceToken vst = itr.next(); + + Iterator itr2 = get( vst.getVarLive() ).iterator(); + while( itr2.hasNext() ) { + VariableSourceToken vst2 = itr2.next(); + + if( curr.getChildren().contains( vst2.getSESE() ) ) { + out.remove( vst2 ); + } + } + } + + return out; + } + + + public boolean equals( Object o ) { + if( o == null ) { + return false; + } + + if( !(o instanceof VarSrcTokTable) ) { + return false; + } + + VarSrcTokTable table = (VarSrcTokTable) o; + return trueSet.equals( table.trueSet ); + } + + public int hashCode() { + return trueSet.hashCode(); + } + + public Iterator iterator() { + return trueSet.iterator(); + } + + public String toString() { + return "trueSet ="+trueSet.toString()+"\n"+ + "sese2vst="+sese2vst.toString()+"\n"+ + "var2vst ="+var2vst.toString()+"\n"+ + "sv2vst ="+sv2vst.toString(); + } +}