From: jjenista Date: Fri, 17 Apr 2009 16:51:08 +0000 (+0000) Subject: liveness analysis simplified to ignore SESE's, analyzes each SESE in isolation. ... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=50a42a32922d236395b405457e869a30356903ce;p=IRC.git liveness analysis simplified to ignore SESE's, analyzes each SESE in isolation. Results look correct, even for loops --- diff --git a/Robust/src/Analysis/MLP/MLPAnalysis.java b/Robust/src/Analysis/MLP/MLPAnalysis.java index 0ba9cacf..e9092d02 100644 --- a/Robust/src/Analysis/MLP/MLPAnalysis.java +++ b/Robust/src/Analysis/MLP/MLPAnalysis.java @@ -23,7 +23,7 @@ public class MLPAnalysis { private FlatSESEExitNode rootExit; private Hashtable< FlatNode, Stack > seseStacks; - private Hashtable< FlatNode, VarSrcTokTable > livenessResults; + private Hashtable< FlatNode, Set > livenessResults; private Hashtable< FlatNode, VarSrcTokTable > variableResults; @@ -43,8 +43,8 @@ public class MLPAnalysis { // initialize analysis data structures seseRoots = new HashSet(); seseStacks = new Hashtable< FlatNode, Stack >(); - livenessResults = new Hashtable< FlatNode, VarSrcTokTable >(); - variableResults = new Hashtable< FlatNode, VarSrcTokTable >(); + livenessResults = new Hashtable< FlatNode, Set >(); + variableResults = new Hashtable< FlatNode, VarSrcTokTable >(); // build an implicit root SESE to wrap contents of main method /* @@ -239,16 +239,19 @@ public class MLPAnalysis { } */ - VarSrcTokTable prev = livenessResults.get( fn ); + Set prev = livenessResults.get( fn ); // merge sets from control flow joins - VarSrcTokTable inUnion = new VarSrcTokTable(); + Set u = new HashSet(); for( int i = 0; i < fn.numNext(); i++ ) { FlatNode nn = fn.getNext( i ); - inUnion.merge( livenessResults.get( nn ) ); + Set s = livenessResults.get( nn ); + if( s != null ) { + u.addAll( s ); + } } - VarSrcTokTable curr = liveness_nodeActions( fn, inUnion, fsen ); + Set curr = liveness_nodeActions( fn, u, fsen ); // if a new result, schedule backward nodes for analysis if( !curr.equals( prev ) ) { @@ -265,11 +268,14 @@ public class MLPAnalysis { } } - fsen.addInVarSet( livenessResults.get( fsen ).get() ); + Set s = livenessResults.get( fsen ); + if( s != null ) { + fsen.addInVarSet( s ); + } if( state.MLPDEBUG ) { System.out.println( "SESE "+fsen.getPrettyIdentifier()+" has in-set:" ); - Iterator tItr = fsen.getInVarSet().iterator(); + Iterator tItr = fsen.getInVarSet().iterator(); while( tItr.hasNext() ) { System.out.println( " "+tItr.next() ); } @@ -284,46 +290,32 @@ public class MLPAnalysis { } } - private VarSrcTokTable liveness_nodeActions( FlatNode fn, - VarSrcTokTable vstTable, - FlatSESEEnterNode currentSESE ) { + private Set liveness_nodeActions( FlatNode fn, + Set liveIn, + FlatSESEEnterNode currentSESE ) { switch( fn.kind() ) { - - case FKind.FlatSESEEnterNode: { - FlatSESEEnterNode fsen = (FlatSESEEnterNode) fn; - - // only age if this is a child SESE, not the current - if( !fsen.equals( currentSESE ) ) { - vstTable = vstTable.age( currentSESE ); - } - } break; - + default: { // handle effects of statement in reverse, writes then reads TempDescriptor [] writeTemps = fn.writesTemps(); for( int i = 0; i < writeTemps.length; ++i ) { - vstTable.remove( writeTemps[i] ); - currentSESE.addOutVar( new VariableSourceToken( currentSESE, - writeTemps[i], - new Integer( 0 ) ) ); + liveIn.remove( writeTemps[i] ); } TempDescriptor [] readTemps = fn.readsTemps(); for( int i = 0; i < readTemps.length; ++i ) { - vstTable.add( new VariableSourceToken( currentSESE, - readTemps[i], - new Integer( 0 ) ) ); + liveIn.add( readTemps[i] ); } } break; } // end switch - return vstTable; + return liveIn; } private void variableAnalysisForward( FlatSESEEnterNode fsen ) { - + /* Set flatNodesToVisit = new HashSet(); flatNodesToVisit.add( fsen ); @@ -372,6 +364,7 @@ public class MLPAnalysis { } System.out.println( "" ); } + */ } private VarSrcTokTable variable_nodeActions( FlatNode fn, diff --git a/Robust/src/IR/Flat/FlatSESEEnterNode.java b/Robust/src/IR/Flat/FlatSESEEnterNode.java index 1373659c..ee035b73 100644 --- a/Robust/src/IR/Flat/FlatSESEEnterNode.java +++ b/Robust/src/IR/Flat/FlatSESEEnterNode.java @@ -9,7 +9,7 @@ public class FlatSESEEnterNode extends FlatNode { protected FlatSESEExitNode exit; protected SESENode treeNode; protected Set children; - protected Set inVars; + protected Set inVars; protected Set outVars; protected FlatMethod enclosing; @@ -17,7 +17,7 @@ public class FlatSESEEnterNode extends FlatNode { this.id = identifier++; treeNode = sn; children = new HashSet(); - inVars = new HashSet(); + inVars = new HashSet(); outVars = new HashSet(); } @@ -35,15 +35,15 @@ public class FlatSESEEnterNode extends FlatNode { return children; } - public void addInVar( VariableSourceToken vst ) { - inVars.add( vst ); + public void addInVar( TempDescriptor td ) { + inVars.add( td ); } public void addOutVar( VariableSourceToken vst ) { outVars.add( vst ); } - public void addInVarSet( Set s ) { + public void addInVarSet( Set s ) { inVars.addAll( s ); } @@ -51,7 +51,7 @@ public class FlatSESEEnterNode extends FlatNode { outVars.addAll( s ); } - public Set getInVarSet() { + public Set getInVarSet() { return inVars; } diff --git a/Robust/src/Tests/mlp/tinyTest/test.java b/Robust/src/Tests/mlp/tinyTest/test.java index 5a6a6a8a..4b902178 100644 --- a/Robust/src/Tests/mlp/tinyTest/test.java +++ b/Robust/src/Tests/mlp/tinyTest/test.java @@ -9,14 +9,12 @@ public class Test { sese top { int x = 0; - - - //for( int i = 0; i < 3; ++i ) { + + for( int i = 0; i < 3; ++i ) { sese iter { - x = x; // + i; + x = x + i; } - //} - + } int j = x + n; }