Buggy code:
protected final MyConcurrentHashMap < M , ConcurrentHashSet < PathEdge < N , D > > > pausedEdges = new MyConcurrentHashMap < M , ConcurrentHashSet < PathEdge < N , D > > > ( ) ; @ DontSynchronize ( "stateless" ) protected final FlowFunctions < N , FieldRef , T , D , M > flowFunctions ; @ DontSynchronize ( "only<seq2seq4repair_space>used<seq2seq4repair_space>by<seq2seq4repair_space>single<seq2seq4repair_space>thread" ) protected final Map < N , Set < D > > initialSeeds ; @ DontSynchronize ( "benign<seq2seq4repair_space>races" ) public long propagationCount ; @ DontSynchronize ( "stateless" ) protected final D zeroValue ; @ DontSynchronize ( "readOnly" ) protected final FlowFunctionCache < N , D , M > ffCache = null ; @ DontSynchronize ( "readOnly" ) protected final boolean followReturnsPastSeeds ; private LinkedList < Runnable > worklist ; public FieldSensitiveIFDSSolver ( IFDSTabulationProblem < N , FieldRef , T , D , M , I > tabulationProblem ) { } public FieldSensitiveIFDSSolver ( IFDSTabulationProblem < N , FieldRef , T , D , M , I > tabulationProblem , @ SuppressWarnings ( "rawtypes" ) CacheBuilder flowFunctionCacheBuilder ) { } public void solve ( ) { } protected void submitInitialSeeds ( ) { } protected void awaitCompletionComputeValuesAndShutdown ( ) { } private void runExecutorAndAwaitCompletion ( ) { } protected void scheduleEdgeProcessing ( PathEdge < N , D > edge ) { } private void processCall ( PathEdge < N , D > edge ) { } private void resumeEdges ( M method , D factAtMethodStartPoint ) { } private void registerInterestedCaller ( M method , IncomingEdge < D , N > incomingEdge ) { } protected Set < ConstrainedFact < FieldRef , T , D > > computeCallFlowFunction ( FlowFunction < FieldRef , T , D > callFlowFunction , D d1 , D d2 ) { } protected Set < ConstrainedFact < FieldRef , T , D > > computeCallToReturnFlowFunction ( FlowFunction < FieldRef , T , D > callToReturnFlowFunction , D d1 , D d2 ) { } protected void processExit ( PathEdge < N , D > edge ) { final N n = edge . getTarget ( ) ; M methodThatNeedsSummary = icfg . getMethodOf ( n ) ; final D d1 = edge . factAtSource ( ) ; final D d2 = edge . factAtTarget ( ) ; SummaryEdge < D , N > summaryEdge = new SummaryEdge < D , N > ( d1 , n , d2 ) ; if ( ! ( addEndSummary ( methodThatNeedsSummary , summaryEdge ) ) ) return ; for ( IncomingEdge < D , N > incomingEdge : incoming ( methodThatNeedsSummary ) ) { N callSite = incomingEdge . getCallSite ( ) ; for ( N retSiteC : icfg . getReturnSitesOfCallAt ( callSite ) ) { FlowFunction < FieldRef , T , D > retFunction = flowFunctions . getReturnFlowFunction ( callSite , methodThatNeedsSummary , n , retSiteC ) ; if ( ( AccessPathUtil . isPrefixOf ( d1 , incomingEdge . getCalleeSourceFact ( ) ) ) == ( PrefixTestResult . GUARANTEED_PREFIX ) ) { Optional < D > concreteCalleeExitFact = AccessPathUtil . applyAbstractedSummary ( incomingEdge . getCalleeSourceFact ( ) , summaryEdge ) ; if ( concreteCalleeExitFact . isPresent ( ) ) { Set < ConstrainedFact < FieldRef , T , D > > callerTargetFacts = computeReturnFlowFunction ( retFunction , concreteCalleeExitFact . get ( ) , callSite ) ; for ( ConstrainedFact < FieldRef , T , D > callerTargetAnnotatedFact : callerTargetFacts ) { D callerTargetFact = restoreContextOnReturnedFact ( incomingEdge . getCallerCallSiteFact ( ) , callerTargetAnnotatedFact . getFact ( ) ) ; propagate ( new PathEdge ( incomingEdge . getCallerSourceFact ( ) , retSiteC , callerTargetFact ) , callSite , false ) ; } } } } } <START_BUG> if ( ( ( followReturnsPastSeeds ) && ( d1 == ( zeroValue ) ) ) && ( incoming ( methodThatNeedsSummary ) . isEmpty ( ) ) ) { <END_BUG> Collection < N > callers = icfg . getCallersOf ( methodThatNeedsSummary ) ; for ( N c : callers ) { for ( N retSiteC : icfg . getReturnSitesOfCallAt ( c ) ) { FlowFunction < FieldRef , T , D > retFunction = flowFunctions . getReturnFlowFunction ( c , methodThatNeedsSummary , n , retSiteC ) ; Set < ConstrainedFact < FieldRef , T , D > > targets = computeReturnFlowFunction ( retFunction , d2 , c ) ; for ( ConstrainedFact < FieldRef , T , D > d5 : targets ) propagate ( new PathEdge ( zeroValue , retSiteC , d5 . getFact ( ) ) , c , true ) ; } } if ( callers . isEmpty ( ) ) { FlowFunction < FieldRef , T , D > retFunction = flowFunctions . getReturnFlowFunction ( null , methodThatNeedsSummary , n , null ) ; retFunction . computeTargets ( d2 ) ; } } } protected Set < ConstrainedFact < FieldRef , T , D > > computeReturnFlowFunction ( FlowFunction < FieldRef , T , D > retFunction , D d2 , N callSite ) { } private void processNormalFlow ( PathEdge < N , D > edge ) { } private D applyConstraint ( Constraint < FieldRef , T > constraint , D fact ) { } private boolean propagateConstrained ( PathEdge < N , D > pathEdge ) { } private boolean propagateConstrained ( PathEdge < N , D > pathEdge , Map < N , Boolean > visited ) { } private boolean hasPausedEdges ( M calleeMethod , PathEdge < N , D > pathEdge ) { } private void pauseEdge ( PathEdge < N , D > edge ) { } protected Set < ConstrainedFact < FieldRef , T , D > > computeNormalFlowFunction ( FlowFunction < FieldRef , T , D > flowFunction , D d1 , D d2 ) { }

Fix:
if ( ( followReturnsPastSeeds ) && ( d1 == ( zeroValue ) ) ) {