+
+ // return value may need to be assigned in caller
+ if( fc.getReturnTemp() != null ) {
+
+ HashSet<HeapRegionNode> assignCallerRhs = new HashSet<HeapRegionNode>();
+
+ LabelNode lnReturnCallee = ogCallee.getLabelNodeFromTemp(tdReturn);
+ Iterator<ReferenceEdge> edgeCalleeItr = lnReturnCallee.iteratorToReferencees();
+ while( edgeCalleeItr.hasNext() ) {
+ ReferenceEdge edgeCallee = edgeCalleeItr.next();
+
+ HashSet<HeapRegionNode> possibleCallerHRNs =
+ getHRNSetThatPossiblyMapToCalleeHRN(ogCallee,
+ edgeCallee.getDst(),
+ false,
+ paramIndex2reachableCallerNodes);
+
+ assignCallerRhs.addAll(possibleCallerHRNs);
+ }
+
+ LabelNode lnLhsCaller = getLabelNodeFromTemp(fc.getReturnTemp() );
+ clearReferenceEdgesFrom(lnLhsCaller, null, true);
+
+ Iterator<HeapRegionNode> itrHrn = assignCallerRhs.iterator();
+ while( itrHrn.hasNext() ) {
+ HeapRegionNode hrnCaller = itrHrn.next();
+
+ ReferenceEdge edgeNew = new ReferenceEdge(lnLhsCaller,
+ hrnCaller,
+ null,
+ false,
+ new ReachabilitySet().makeCanonical()
+ );
+
+ addReferenceEdge(lnLhsCaller, hrnCaller, edgeNew);
+ }
+ }
+
+
+