private Hashtable< FlatNode, Set<TempDescriptor> > notAvailableResults;
private Hashtable< FlatNode, CodePlan > codePlans;
+ private Hashtable< FlatSESEEnterNode, Set<TempDescriptor> > notAvailableIntoSESE;
+
private Hashtable< FlatEdge, FlatWriteDynamicVarNode > wdvNodesToSpliceIn;
private Hashtable< MethodContext, HashSet<AllocationSite>> mapMethodContextToLiveInAllocationSiteSet;
notAvailableResults = new Hashtable< FlatNode, Set<TempDescriptor> >();
codePlans = new Hashtable< FlatNode, CodePlan >();
wdvNodesToSpliceIn = new Hashtable< FlatEdge, FlatWriteDynamicVarNode >();
+
+ notAvailableIntoSESE = new Hashtable< FlatSESEEnterNode, Set<TempDescriptor> >();
mapMethodContextToLiveInAllocationSiteSet = new Hashtable< MethodContext, HashSet<AllocationSite>>();
case FKind.FlatSESEEnterNode: {
FlatSESEEnterNode fsen = (FlatSESEEnterNode) fn;
assert fsen.equals( currentSESE );
+
+ // keep a copy of what's not available into the SESE
+ // and restore it at the matching exit node
+ Set<TempDescriptor> notAvailCopy = new HashSet<TempDescriptor>();
+ Iterator<TempDescriptor> tdItr = notAvailSet.iterator();
+ while( tdItr.hasNext() ) {
+ notAvailCopy.add( tdItr.next() );
+ }
+ notAvailableIntoSESE.put( fsen, notAvailCopy );
+
notAvailSet.clear();
} break;
FlatSESEExitNode fsexn = (FlatSESEExitNode) fn;
FlatSESEEnterNode fsen = fsexn.getFlatEnter();
assert currentSESE.getChildren().contains( fsen );
+
notAvailSet.addAll( fsen.getOutVarSet() );
+
+ Set<TempDescriptor> notAvailIn = notAvailableIntoSESE.get( fsen );
+ assert notAvailIn != null;
+ notAvailSet.addAll( notAvailIn );
+
} break;
case FKind.FlatMethod: {