if( virtualReadTemps != null ) {
Iterator<TempDescriptor> vrItr = virtualReadTemps.iterator();
while( vrItr.hasNext() ) {
- liveIn.add( vrItr.next() );
+ TempDescriptor vrt = vrItr.next();
+ liveIn.add( vrt );
}
}
} break;
for( int i = 0; i < fn.numPrev(); i++ ) {
FlatNode nn = fn.getPrev( i );
Set<TempDescriptor> availIn = isAvailableResults.get( nn );
- inIntersect.retainAll( availIn );
+ if( availIn != null ) {
+ inIntersect.retainAll( availIn );
+ }
}
Set<TempDescriptor> curr = isAvailable_nodeActions( fn, inIntersect, seseStack.peek() );
private Set<TempDescriptor> isAvailable_nodeActions( FlatNode fn,
Set<TempDescriptor> isAvailSet,
FlatSESEEnterNode currentSESE ) {
+ // any temps that get added to the available set
+ // at this node should be marked in this node's
+ // code plan as temps to be grabbed at runtime!
+
switch( fn.kind() ) {
case FKind.FlatSESEEnterNode: {
FlatSESEExitNode fsexn = (FlatSESEExitNode) fn;
FlatSESEEnterNode fsen = fsexn.getFlatEnter();
assert currentSESE.getChildren().contains( fsen );
+ isAvailSet.addAll( fsen.getOutVarSet() );
} break;
default: {
- TempDescriptor [] writeTemps = fn.writesTemps();
+ TempDescriptor [] readTemps = fn.readsTemps();
+ for( int i = 0; i < readTemps.length; i++ ) {
+ TempDescriptor rTemp = readTemps[i];
+ isAvailSet.add( rTemp );
+ }
} break;
} // end switch
flatNodesToVisit.add( nn );
}
}
- }
+ }
if( state.MLPDEBUG ) {
- System.out.println( fm.printMethod( codePlans ) );
+ System.out.println( fm.printMethod( livenessRootView ) );
+ //System.out.println( fm.printMethod( isAvailableResults ) );
+ //System.out.println( fm.printMethod( codePlans ) );
}
}
Set<VariableSourceToken> stallSet = vstTable.getStallSet( currentSESE );
TempDescriptor[] readarray = fn.readsTemps();
for( int i = 0; i < readarray.length; i++ ) {
+ Set<VariableSourceToken> forRemoval = new HashSet<VariableSourceToken>();
TempDescriptor readtmp = readarray[i];
Set<VariableSourceToken> readSet = vstTable.get( readtmp );
//containsAny
before = "**STALL for:";
}
before += "("+vst+" "+readtmp+")";
+
+ // mark any other variables from the static SESE for
+ // removal, because after this stall we'll have them
+ // all for later statements
+ forRemoval.addAll( vstTable.get( vst.getSESE(),
+ vst.getAge()
+ )
+ );
}
- }
+ }
+
+ Iterator<VariableSourceToken> vstItr = forRemoval.iterator();
+ while( vstItr.hasNext() ) {
+ VariableSourceToken vst = vstItr.next();
+ vstTable.remove( vst );
+ }
}
} break;