@@ -827,7 +827,8 @@ private predicate straightLineDense(Node scope, int rnk, Node nrnk, Spec spec) {
827827 * but most cases should be handled through one of the convenience predicates
828828 * as outlined in the comment at the top of this file.
829829 */
830- private predicate subEdge ( Node n1 , Pos p1 , Node n2 , Pos p2 ) {
830+ // The parameters are ordered this way for performance.
831+ private predicate subEdge ( Pos p1 , Node n1 , Node n2 , Pos p2 ) {
831832 exists ( Node scope , int rnk , Spec spec1 , Spec spec2 |
832833 straightLineDense ( scope , rnk , n1 , spec1 ) and
833834 straightLineDense ( scope , rnk + 1 , n2 , spec2 ) and
@@ -997,13 +998,13 @@ private predicate subEdge(Node n1, Pos p1, Node n2, Pos p2) {
997998 * predicate includes all sub-edges except those with true/false labels (see
998999 * `conditionJumps`).
9991000 */
1000- private predicate subEdgeIncludingDestructors ( Node n1 , Pos p1 , Node n2 , Pos p2 ) {
1001- subEdge ( n1 , p1 , n2 , p2 )
1001+ private predicate subEdgeIncludingDestructors ( Pos p1 , Node n1 , Node n2 , Pos p2 ) {
1002+ subEdge ( p1 , n1 , n2 , p2 )
10021003 or
10031004 // If `n1` has sub-nodes to accomodate destructors, but there are none to be
10041005 // called, connect the "before destructors" node directly to the "after
10051006 // destructors" node. For performance, only do this when the nodes exist.
1006- exists ( Pos afterDtors | afterDtors .isAfterDestructors ( ) | subEdge ( n1 , afterDtors , _, _) ) and
1007+ exists ( Pos afterDtors | afterDtors .isAfterDestructors ( ) | subEdge ( afterDtors , n1 , _, _) ) and
10071008 not exists ( getDestructorCallAfterNode ( n1 , 0 ) ) and
10081009 p1 .nodeBeforeDestructors ( n1 , n1 ) and
10091010 p2 .nodeAfterDestructors ( n2 , n1 )
@@ -1286,22 +1287,27 @@ private predicate conditionJumps(Expr test, boolean truth, Node n2, Pos p2) {
12861287 )
12871288}
12881289
1290+ // Factored out for performance. See QL-796.
1291+ private predicate normalGroupMemberBaseCase ( Node memberNode , Pos memberPos , Node atNode ) {
1292+ memberNode = atNode and
1293+ memberPos .isAt ( ) and
1294+ // We check for excludeNode here as it's slower to check in all the leaf
1295+ // cases during construction of the sub-graph.
1296+ not excludeNode ( atNode )
1297+ }
1298+
12891299/**
12901300 * Holds if the sub-node `(memberNode, memberPos)` can reach `at(atNode)` by
12911301 * following sub-edges forward without crossing another "at" node. Here,
12921302 * `memberPos.isAt()` holds only when `memberNode = atNode`.
12931303 */
12941304private predicate normalGroupMember ( Node memberNode , Pos memberPos , Node atNode ) {
1295- memberNode = atNode and
1296- memberPos .isAt ( ) and
1297- // We check for excludeNode here as it's slower to check in all the leaf
1298- // cases during construction of the sub-graph.
1299- not excludeNode ( atNode )
1305+ normalGroupMemberBaseCase ( memberNode , memberPos , atNode )
13001306 or
13011307 exists ( Node succNode , Pos succPos |
13021308 normalGroupMember ( succNode , succPos , atNode ) and
13031309 not memberPos .isAt ( ) and
1304- subEdgeIncludingDestructors ( memberNode , memberPos , succNode , succPos )
1310+ subEdgeIncludingDestructors ( memberPos , memberNode , succNode , succPos )
13051311 )
13061312}
13071313
@@ -1317,7 +1323,7 @@ private predicate precedesCondition(Node memberNode, Pos memberPos, Node test) {
13171323 or
13181324 exists ( Node succNode , Pos succPos |
13191325 precedesCondition ( succNode , succPos , test ) and
1320- subEdgeIncludingDestructors ( memberNode , memberPos , succNode , succPos ) and
1326+ subEdgeIncludingDestructors ( memberPos , memberNode , succNode , succPos ) and
13211327 // Unlike the similar TC in normalGroupMember we're here including the
13221328 // At-node in the group. This should generalize better to the case where
13231329 // the base case isn't always an After-node.
@@ -1355,7 +1361,7 @@ private module Cached {
13551361 cached
13561362 predicate qlCFGSuccessor ( Node n1 , Node n2 ) {
13571363 exists ( Node memberNode , Pos memberPos |
1358- subEdgeIncludingDestructors ( n1 , any ( Pos at | at .isAt ( ) ) , memberNode , memberPos ) and
1364+ subEdgeIncludingDestructors ( any ( Pos at | at .isAt ( ) ) , n1 , memberNode , memberPos ) and
13591365 normalGroupMember ( memberNode , memberPos , n2 )
13601366 )
13611367 or
0 commit comments