From: jjenista Date: Wed, 8 Oct 2008 23:03:38 +0000 (+0000) Subject: Global sweep added X-Git-Tag: buildscript^7~75 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d4b5981c806063412e03ab8d9120fbda2e986978;p=IRC.git Global sweep added --- diff --git a/Robust/src/Analysis/OwnershipAnalysis/HeapRegionNode.java b/Robust/src/Analysis/OwnershipAnalysis/HeapRegionNode.java index e474ad63..5436e856 100644 --- a/Robust/src/Analysis/OwnershipAnalysis/HeapRegionNode.java +++ b/Robust/src/Analysis/OwnershipAnalysis/HeapRegionNode.java @@ -10,6 +10,7 @@ public class HeapRegionNode extends OwnershipNode { protected boolean isSingleObject; protected boolean isFlagged; + protected boolean isParameter; protected boolean isNewSummary; protected HashSet referencers; @@ -26,6 +27,7 @@ public class HeapRegionNode extends OwnershipNode { public HeapRegionNode(Integer id, boolean isSingleObject, boolean isFlagged, + boolean isParameter, boolean isNewSummary, AllocationSite allocSite, ReachabilitySet alpha, @@ -33,6 +35,7 @@ public class HeapRegionNode extends OwnershipNode { this.id = id; this.isSingleObject = isSingleObject; this.isFlagged = isFlagged; + this.isParameter = isParameter; this.isNewSummary = isNewSummary; this.allocSite = allocSite; this.alpha = alpha; @@ -46,6 +49,7 @@ public class HeapRegionNode extends OwnershipNode { return new HeapRegionNode(id, isSingleObject, isFlagged, + isParameter, isNewSummary, allocSite, alpha, @@ -80,6 +84,7 @@ public class HeapRegionNode extends OwnershipNode { assert isSingleObject == hrn.isSingleObject(); assert isFlagged == hrn.isFlagged(); + assert isParameter == hrn.isParameter(); assert isNewSummary == hrn.isNewSummary(); assert description.equals(hrn.getDescription() ); @@ -99,6 +104,10 @@ public class HeapRegionNode extends OwnershipNode { return isFlagged; } + public boolean isParameter() { + return isParameter; + } + public boolean isNewSummary() { return isNewSummary; } diff --git a/Robust/src/Analysis/OwnershipAnalysis/OwnershipGraph.java b/Robust/src/Analysis/OwnershipAnalysis/OwnershipGraph.java index 126f2886..95c7c4f0 100644 --- a/Robust/src/Analysis/OwnershipAnalysis/OwnershipGraph.java +++ b/Robust/src/Analysis/OwnershipAnalysis/OwnershipGraph.java @@ -100,6 +100,7 @@ public class OwnershipGraph { HeapRegionNode hrn = new HeapRegionNode(id, isSingleObject, isFlagged, + isParameter, isNewSummary, allocSite, alpha, @@ -412,12 +413,39 @@ public class OwnershipGraph { HashSet nodesWithNewAlpha = new HashSet(); HashSet edgesWithNewBeta = new HashSet(); + + // first look for possible strong updates and remove those edges boolean strongUpdate = false; Iterator itrXhrn = lnX.iteratorToReferencees(); while( itrXhrn.hasNext() ) { ReferenceEdge edgeX = itrXhrn.next(); - HeapRegionNode hrnX = edgeX.getDst(); + HeapRegionNode hrnX = edgeX.getDst(); + + Iterator itrYhrn = lnY.iteratorToReferencees(); + while( itrYhrn.hasNext() ) { + ReferenceEdge edgeY = itrYhrn.next(); + HeapRegionNode hrnY = edgeY.getDst(); + + // we can do a strong update here if one of two cases holds + if( f != null && + hrnX.isSingleObject() && + ( (hrnX.getNumReferencers() == 1) || + ( lnX.getNumReferencees() == 1) + ) + ) { + strongUpdate = true; + clearReferenceEdgesFrom( hrnX, f, false ); + } + } + } + + + // then do all token propagation + itrXhrn = lnX.iteratorToReferencees(); + while( itrXhrn.hasNext() ) { + ReferenceEdge edgeX = itrXhrn.next(); + HeapRegionNode hrnX = edgeX.getDst(); ReachabilitySet betaX = edgeX.getBeta(); ReachabilitySet R = hrnX.getAlpha().intersection(edgeX.getBeta() ); @@ -425,8 +453,8 @@ public class OwnershipGraph { Iterator itrYhrn = lnY.iteratorToReferencees(); while( itrYhrn.hasNext() ) { ReferenceEdge edgeY = itrYhrn.next(); - HeapRegionNode hrnY = edgeY.getDst(); - ReachabilitySet O = edgeY.getBeta(); + HeapRegionNode hrnY = edgeY.getDst(); + ReachabilitySet O = edgeY.getBeta(); // propagate tokens over nodes starting from hrnSrc, and it will @@ -454,50 +482,49 @@ public class OwnershipGraph { propagateTokensOverEdges(todoEdges, edgePlannedChanges, edgesWithNewBeta); + } + } - // if edgeY's beta was updated, use that to calculate beta for new edge - // otherwise the edgeY didn't change and it is the source for the calc - ReachabilitySet sourceBetaForNewEdge; - //if( edgesWithNewBeta.contains( edgeY ) ) { - if( !edgeY.getBetaNew().equals( new ReachabilitySet().makeCanonical() ) ) { - sourceBetaForNewEdge = edgeY.getBetaNew(); - } else { - sourceBetaForNewEdge = edgeY.getBeta(); - } - ReachabilitySet sourceAlphaForPrune; - if( !hrnX.getAlphaNew().equals( new ReachabilitySet().makeCanonical() ) ) { - sourceAlphaForPrune = hrnX.getAlphaNew(); - } else { - sourceAlphaForPrune = hrnX.getAlpha(); - } + // apply the updates to reachability + Iterator nodeItr = nodesWithNewAlpha.iterator(); + while( nodeItr.hasNext() ) { + nodeItr.next().applyAlphaNew(); + } + + Iterator edgeItr = edgesWithNewBeta.iterator(); + while( edgeItr.hasNext() ) { + edgeItr.next().applyBetaNew(); + } + + + // then go back through and add the new edges + itrXhrn = lnX.iteratorToReferencees(); + while( itrXhrn.hasNext() ) { + ReferenceEdge edgeX = itrXhrn.next(); + HeapRegionNode hrnX = edgeX.getDst(); + + Iterator itrYhrn = lnY.iteratorToReferencees(); + while( itrYhrn.hasNext() ) { + ReferenceEdge edgeY = itrYhrn.next(); + HeapRegionNode hrnY = edgeY.getDst(); // prepare the new reference edge hrnX.f -> hrnY ReferenceEdge edgeNew = new ReferenceEdge(hrnX, hrnY, f, false, - sourceBetaForNewEdge.pruneBy( sourceAlphaForPrune ) + edgeY.getBeta().pruneBy( hrnX.getAlpha() ) ); - // we can do a strong update here if one of two cases holds - if( f != null && - ( (hrnX.getNumReferencers() == 1) || - ( lnX.getNumReferencees() == 1 && hrnX.isSingleObject() ) - ) - ) { - strongUpdate = true; - clearReferenceEdgesFrom( hrnX, f, false ); - } - // look to see if an edge with same field exists // and merge with it, otherwise just add the edge ReferenceEdge edgeExisting = hrnX.getReferenceTo( hrnY, f ); - + if( edgeExisting != null ) { - edgeExisting.setBetaNew( - edgeExisting.getBetaNew().union( edgeNew.getBeta() ) - ); + edgeExisting.setBeta( + edgeExisting.getBeta().union( edgeNew.getBeta() ) + ); // a new edge here cannot be reflexive, so existing will // always be also not reflexive anymore edgeExisting.setIsInitialParamReflexive( false ); @@ -507,24 +534,11 @@ public class OwnershipGraph { } } - Iterator nodeItr = nodesWithNewAlpha.iterator(); - while( nodeItr.hasNext() ) { - nodeItr.next().applyAlphaNew(); - } - Iterator edgeItr = edgesWithNewBeta.iterator(); - while( edgeItr.hasNext() ) { - edgeItr.next().applyBetaNew(); - } - - // if it was a strong update, make sure to improve + // if there was a strong update, make sure to improve // reachability with a global sweep if( strongUpdate ) { - //try { - //writeGraph( "testBefore", true, true, true, false, false ); - globalSweep(); - //writeGraph( "testPost", true, true, true, false, false ); - //} catch( Exception e ) {} + globalSweep(); } } @@ -1514,8 +1528,7 @@ public class OwnershipGraph { } } - // last thing in the entire method call is to do a global sweep - // and try to clean up a little bit + // improve reachability as much as possible globalSweep(); } @@ -1828,8 +1841,8 @@ public class OwnershipGraph { Hashtable > workSet = new Hashtable >(); - // first initialize every alphaNew for a flagged region to - // a set with just that token + // first initialize every alphaNew for a flagged region + // (or parameter region) to a set with just that token Set hrns = id2hrn.entrySet(); Iterator itrHrns = hrns.iterator(); while( itrHrns.hasNext() ) { @@ -1840,8 +1853,6 @@ public class OwnershipGraph { // assert that this node and incoming edges have clean alphaNew // and betaNew sets, respectively ReachabilitySet rsEmpty = new ReachabilitySet().makeCanonical(); - //System.out.println( "hrn="+hrn ); - //System.out.println( "alphaNew="+hrn.getAlphaNew() ); assert rsEmpty.equals( hrn.getAlphaNew() ); Iterator itrRes = hrn.iteratorToReferencers(); @@ -1859,7 +1870,7 @@ public class OwnershipGraph { TokenTupleSet ttsStar = new TokenTupleSet( ttStar ).makeCanonical(); TokenTupleSet ttsEmpty = new TokenTupleSet( ).makeCanonical(); - if( hrn.isFlagged() ) { + if( hrn.isFlagged() || hrn.isParameter() ) { HashSet subWorkSet = new HashSet(); subWorkSet.add( tts ); subWorkSet.add( ttsPlus ); @@ -1893,13 +1904,13 @@ public class OwnershipGraph { Iterator itrRes = hrn.iteratorToReferencees(); while( itrRes.hasNext() ) { ReferenceEdge edge = itrRes.next(); + if( edge.getBeta().containsSuperSet( tts ) ) { HeapRegionNode dst = edge.getDst(); // make a set of possible contributions this token // might have on the alpha set here HashSet ttsNewSet = new HashSet(); - //ttsNewSet.add( tts ); Iterator itrDstAlphaNew = dst.getAlphaNew().iterator(); while( itrDstAlphaNew.hasNext() ) { diff --git a/Robust/src/Benchmarks/Ownership/BankApp.txt b/Robust/src/Benchmarks/Ownership/BankApp.txt index b1ec1c2b..283458e8 100644 --- a/Robust/src/Benchmarks/Ownership/BankApp.txt +++ b/Robust/src/Benchmarks/Ownership/BankApp.txt @@ -1,9 +1,9 @@ Conducting ownership analysis with allocation depth = 1 ---------AcceptConnection(ServerSocket ss)-------- -Task AcceptConnection(ServerSocket ss) contains no aliases between flagged objects. +No aliases between flagged objects in Task AcceptConnection(ServerSocket ss). ---------Startup(StartupObject s)-------- -Task Startup(StartupObject s) contains no aliases between flagged objects. +No aliases between flagged objects in Task Startup(StartupObject s). ---------ProcessRequest(BankAppSocket bas, BankDatabase Bank)-------- -Task ProcessRequest(BankAppSocket bas, BankDatabase Bank) contains no aliases between flagged objects. +No aliases between flagged objects in Task ProcessRequest(BankAppSocket bas, BankDatabase Bank). diff --git a/Robust/src/Tests/OwnershipAnalysisTest/test01/test01.java b/Robust/src/Tests/OwnershipAnalysisTest/test01/test01.java index 3787b57f..fbd45285 100644 --- a/Robust/src/Tests/OwnershipAnalysisTest/test01/test01.java +++ b/Robust/src/Tests/OwnershipAnalysisTest/test01/test01.java @@ -206,7 +206,7 @@ task Startup( StartupObject s{ initialstate } ) { taskexit( s{ !initialstate } ); } -/* + task NewObjectA( Foo a{ f }, Foo b{ f } ) { @@ -327,7 +327,7 @@ task SummaryNodeTokens( Foo p0{ f } ) { taskexit( p0{ !f } ); } -*/ + task strongUpdates( Foo p0{ f } ) { @@ -363,7 +363,7 @@ task strongUpdates( Foo p0{ f } ) { taskexit( p0{ !f } ); } -/* + task ObjectChainByMethodCalls( Foo a{ f } ) { @@ -619,7 +619,7 @@ task methodTest06_( Foo p0{ f }, Foo p1{ f } ) { a1after.x = new Foo(); } - //Foo.m6_( a0after, a1after ); + Foo.m6_( a0after, a1after ); taskexit( p0{ !f }, p1{ !f } ); @@ -656,7 +656,7 @@ task methodTest07_( Foo p0{ f }, Foo p1{ f } ) { a1after.x = new Foo(); } - //Foo.m7_( a0after, a1after ); + Foo.m7_( a0after, a1after ); taskexit( p0{ !f }, p1{ !f } ); @@ -693,14 +693,13 @@ task methodTest08_( Foo p0{ f }, Foo p1{ f } ) { a1after.x = new Foo(); } - //Foo.m8_( a0after, a1after ); + Foo.m8_( a0after, a1after ); taskexit( p0{ !f }, p1{ !f } ); } -*/ -/* + task methodTest09_( Foo p0{ f }, Foo p1{ f } ) { Foo a0before = new Foo(); @@ -736,4 +735,4 @@ task methodTest09_( Foo p0{ f }, Foo p1{ f } ) { taskexit( p0{ !f }, p1{ !f } ); } -*/ +