class StrongLocalMustAliasAnalysis extends LocalMustAliasAnalysis {

  protected final Set<Integer> invalidInstanceKeys;

  public StrongLocalMustAliasAnalysis(UnitGraph g) {
    super(g);
    this.invalidInstanceKeys = new HashSet<Integer>();
    /*
     * Find all SCCs, then invalidate all instance keys for variable defined within an SCC.
     */
    StronglyConnectedComponentsFast<Unit> sccAnalysis = new StronglyConnectedComponentsFast<Unit>(g);
    for (List<Unit> scc : sccAnalysis.getTrueComponents()) {
      for (Unit unit : scc) {
        for (ValueBox vb : unit.getDefBoxes()) {
          Value defValue = vb.getValue();
          if (defValue instanceof Local) {
            Local defLocal = (Local) defValue;
            if (defLocal.getType() instanceof RefLikeType) {
              // if key is not already UNKNOWN
              invalidInstanceKeys.add(getFlowBefore(unit).get(defLocal));
              // if key is not already UNKNOWN
              invalidInstanceKeys.add(getFlowAfter(unit).get(defLocal));
            }
          }
        }
      }
    }
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public boolean mustAlias(Local l1, Stmt s1, Local l2, Stmt s2) {<FILL_FUNCTION_BODY>}

  /**
   * {@inheritDoc}
   */
  @Override
  public String instanceKeyString(Local l, Stmt s) {
    return invalidInstanceKeys.contains(getFlowBefore(s).get(l)) ? "UNKNOWN" : super.instanceKeyString(l, s);
  }
}

    Integer l1n = getFlowBefore(s1).get(l1);
    Integer l2n = getFlowBefore(s2).get(l2);
    return l1n != null && l2n != null && !invalidInstanceKeys.contains(l1n) && !invalidInstanceKeys.contains(l2n)
        && l1n.equals(l2n);
  
<methods>public void <init>(soot.toolkits.graph.UnitGraph) ,public void <init>(soot.toolkits.graph.UnitGraph, boolean) ,public boolean hasInfoOn(soot.Local, soot.jimple.Stmt) ,public java.lang.String instanceKeyString(soot.Local, soot.jimple.Stmt) ,public boolean mustAlias(soot.Local, soot.jimple.Stmt, soot.Local, soot.jimple.Stmt) ,public static int parameterRefNumber(soot.jimple.ParameterRef) ,public static int thisRefNumber() <variables>protected soot.SootMethod container,protected Set<soot.Value> localsAndFieldRefs,protected transient Map<soot.Unit,Map<soot.Value,java.lang.Integer>> mergePointToValueToNumber,protected int nextNumber,protected transient Map<soot.Value,java.lang.Integer> rhsToNumber