mapDescriptorToReachGraph =
new Hashtable<Descriptor, ReachGraph>();
- pm = new PointerMethod();
-
fc2enclosing = new Hashtable<FlatCall, Descriptor>();
}
ReachGraph.debugCallSiteVisitCounter
= 0; // count visits from 1, is incremented before first visit
+ pm = new PointerMethod();
+
if( state.DO_DEFINITE_REACH_ANALYSIS ) {
doDefiniteReachAnalysis = true;
- definiteReachAnalysis = new DefiniteReachAnalysis();
+ definiteReachAnalysis = new DefiniteReachAnalysis( pm );
}
FlatSESEEnterNode sese;
FlatSESEExitNode fsexn;
+ boolean alreadyReachable;
Set<EdgeKey> edgeKeysForLoad;
Set<EdgeKey> edgeKeysRemoved;
Set<EdgeKey> edgeKeysAdded;
+ Set<DefiniteReachState.FdEntry> edgesToElideFromProp;
//Stores the flatnode's reach graph at enter
ReachGraph rgOnEnter = new ReachGraph();
boolean strongUpdate = false;
- edgeKeysRemoved = null;
- edgeKeysAdded = null;
+ alreadyReachable = false;
+ edgeKeysRemoved = null;
+ edgeKeysAdded = null;
+ edgesToElideFromProp = null;
if( doDefiniteReachAnalysis ) {
- edgeKeysRemoved = new HashSet<EdgeKey>();
- edgeKeysAdded = new HashSet<EdgeKey>();
+ alreadyReachable = definiteReachAnalysis.isAlreadyReachable( rhs, lhs, fn );
+ edgeKeysRemoved = new HashSet<EdgeKey>();
+ edgeKeysAdded = new HashSet<EdgeKey>();
+ edgesToElideFromProp = definiteReachAnalysis.edgesToElidePropagation( lhs, rhs, fn );
}
// before transfer func, possibly inject
fld,
rhs,
fn,
+ alreadyReachable,
edgeKeysRemoved,
- edgeKeysAdded );
+ edgeKeysAdded,
+ edgesToElideFromProp );
if( doDefiniteReachAnalysis ) {
definiteReachAnalysis.store( fn,
lhs,
tdElement = lhs.getType().dereference();
fdElement = getArrayField(tdElement);
- edgeKeysRemoved = null;
- edgeKeysAdded = null;
+ alreadyReachable = false;
+ edgeKeysRemoved = null;
+ edgeKeysAdded = null;
+ edgesToElideFromProp = null;
if( doDefiniteReachAnalysis ) {
- edgeKeysRemoved = new HashSet<EdgeKey>();
- edgeKeysAdded = new HashSet<EdgeKey>();
+ alreadyReachable = definiteReachAnalysis.isAlreadyReachable( rhs, lhs, fn );
+ edgeKeysRemoved = new HashSet<EdgeKey>();
+ edgeKeysAdded = new HashSet<EdgeKey>();
+ edgesToElideFromProp = definiteReachAnalysis.edgesToElidePropagation( lhs, rhs, fn );
}
// before transfer func, possibly inject
fdElement,
rhs,
fn,
+ alreadyReachable,
edgeKeysRemoved,
- edgeKeysAdded );
+ edgeKeysAdded,
+ edgesToElideFromProp );
}
if( doDefiniteReachAnalysis ) {