@@ -340,19 +340,42 @@ module ProductFlow {
340340 fwdIsSuccessor ( _, _, node1 , node2 )
341341 }
342342
343+ pragma [ nomagic]
344+ private predicate fwdIsSuccessorExit (
345+ Flow1:: PathNode mid1 , Flow2:: PathNode mid2 , Flow1:: PathNode succ1 , Flow2:: PathNode succ2
346+ ) {
347+ isSinkPair ( mid1 , mid2 ) and
348+ succ1 = mid1 and
349+ succ2 = mid2
350+ or
351+ interprocEdgePair ( mid1 , mid2 , succ1 , succ2 )
352+ }
353+
354+ private predicate fwdIsSuccessor1 (
355+ Flow1:: PathNode pred1 , Flow2:: PathNode pred2 , Flow1:: PathNode mid1 , Flow2:: PathNode mid2 ,
356+ Flow1:: PathNode succ1 , Flow2:: PathNode succ2
357+ ) {
358+ fwdReachableInterprocEntry ( pred1 , pred2 ) and
359+ localPathStep1 * ( pred1 , mid1 ) and
360+ fwdIsSuccessorExit ( pragma [ only_bind_into ] ( mid1 ) , pragma [ only_bind_into ] ( mid2 ) , succ1 , succ2 )
361+ }
362+
363+ private predicate fwdIsSuccessor2 (
364+ Flow1:: PathNode pred1 , Flow2:: PathNode pred2 , Flow1:: PathNode mid1 , Flow2:: PathNode mid2 ,
365+ Flow1:: PathNode succ1 , Flow2:: PathNode succ2
366+ ) {
367+ fwdReachableInterprocEntry ( pred1 , pred2 ) and
368+ localPathStep2 * ( pred2 , mid2 ) and
369+ fwdIsSuccessorExit ( pragma [ only_bind_into ] ( mid1 ) , pragma [ only_bind_into ] ( mid2 ) , succ1 , succ2 )
370+ }
371+
372+ pragma [ assume_small_delta]
343373 private predicate fwdIsSuccessor (
344374 Flow1:: PathNode pred1 , Flow2:: PathNode pred2 , Flow1:: PathNode succ1 , Flow2:: PathNode succ2
345375 ) {
346- fwdReachableInterprocEntry ( pred1 , pred2 ) and
347376 exists ( Flow1:: PathNode mid1 , Flow2:: PathNode mid2 |
348- localPathStep1 * ( pred1 , mid1 ) and
349- localPathStep2 * ( pred2 , mid2 )
350- |
351- isSinkPair ( mid1 , mid2 ) and
352- succ1 = mid1 and
353- succ2 = mid2
354- or
355- interprocEdgePair ( mid1 , mid2 , succ1 , succ2 )
377+ fwdIsSuccessor1 ( pred1 , pred2 , mid1 , mid2 , succ1 , succ2 ) and
378+ fwdIsSuccessor2 ( pred1 , pred2 , mid1 , mid2 , succ1 , succ2 )
356379 )
357380 }
358381
0 commit comments