+ FlatMethod calleeFM = state.getMethodFlat(fc.getMethod());
+
+ // retrieve callee's method summary
+ MethodSummary calleeMethodSummary = methodSummaryResults
+ .get(calleeFM);
+
+ if (calleeMethodSummary != null
+ && calleeMethodSummary.getChildSESECount() > 0) {
+
+ // when parameter variable is accessible,
+ // use callee's preeffects to figure out about how it affects
+ // caller's stall site
+
+ for (int i = 0; i < fc.numArgs(); i++) {
+ TempDescriptor paramTemp = fc.getArg(i);
+
+ if (currentConflictsMap != null) {
+ if (currentConflictsMap.isAccessible(paramTemp)
+ && currentConflictsMap.hasStallSite(paramTemp)) {
+ // preeffect contribute its effect to caller's stall
+ // site
+
+ int offset = 0;
+ if (!fc.getMethod().isStatic()) {
+ offset = 1;
+ }
+
+ HashSet<PreEffectsKey> preeffectSet = calleeMethodSummary
+ .getEffectsSetByParamIdx(i + offset);
+
+ for (Iterator iterator = preeffectSet.iterator(); iterator
+ .hasNext();) {
+ PreEffectsKey preEffectsKey = (PreEffectsKey) iterator
+ .next();
+ currentConflictsMap.contributeEffect(paramTemp,
+ preEffectsKey.getType(), preEffectsKey
+ .getField(), preEffectsKey
+ .getEffectType());
+ }
+ }
+ }
+ // in other cases, child SESE has not been discovered,
+ // assumes that all variables are accessible
+
+ }
+
+ // If callee has at least one child sese, all parent object
+ // is going to be inaccessible.
+ currentConflictsMap = new ParentChildConflictsMap();
+
+ TempDescriptor returnTemp = fc.getReturnTemp();
+
+ if (calleeMethodSummary.getReturnValueAccessibility().equals(
+ MethodSummary.ACCESSIBLE)) {
+ // when return value is accessible, associate with its
+ // stall site
+ currentConflictsMap.addAccessibleVar(returnTemp);
+ currentConflictsMap.addStallSite(returnTemp,
+ calleeMethodSummary.getReturnStallSite());
+ } else if (calleeMethodSummary.getReturnValueAccessibility()
+ .equals(MethodSummary.INACCESSIBLE)) {
+ // when return value is inaccessible
+ currentConflictsMap.addInaccessibleVar(returnTemp);
+ }
+ }
+
+ // TODO: need to handle edge mappings from callee
+
+ }
+ break;
+
+ case FKind.FlatReturnNode: {
+
+ FlatReturnNode frn = (FlatReturnNode) fn;
+ TempDescriptor returnTD = frn.getReturnTemp();
+
+ if (returnTD != null) {
+ if (currentConflictsMap == null) {
+ // in this case, all variables is accessible. There are no
+ // child SESEs.
+ } else {
+ if (currentConflictsMap.isAccessible(returnTD)) {
+ currentMethodSummary
+ .setReturnValueAccessibility(MethodSummary.ACCESSIBLE);
+ StallSite returnStallSite = currentConflictsMap
+ .getStallMap().get(returnTD);
+ currentMethodSummary
+ .setReturnStallSite(returnStallSite);
+ } else {
+ currentMethodSummary
+ .setReturnValueAccessibility(MethodSummary.INACCESSIBLE);
+ }
+ }
+ }
+ }
+ break;
+
+ case FKind.FlatExit: {
+
+ // store method summary when it has at least one child SESE
+ if (currentMethodSummary.getChildSESECount() > 0) {
+ FlatMethod fm = state.getMethodFlat(mc.getDescriptor()); // current
+ // flat
+ // method
+ methodSummaryResults.put(fm, currentMethodSummary);
+ }