Skip to content

Commit c74b891

Browse files
committed
C++: Reorder parameters to subEdge relations
This improves performance slightly by putting the parameters in the order in which they'll be needed in `qlCFGSuccessor`.
1 parent b3bcabf commit c74b891

File tree

1 file changed

+8
-7
lines changed
  • cpp/ql/src/semmle/code/cpp/controlflow/internal

1 file changed

+8
-7
lines changed

cpp/ql/src/semmle/code/cpp/controlflow/internal/CFG.qll

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
@@ -1301,7 +1302,7 @@ private predicate normalGroupMember(Node memberNode, Pos memberPos, Node atNode)
13011302
exists(Node succNode, Pos succPos |
13021303
normalGroupMember(succNode, succPos, atNode) and
13031304
not memberPos.isAt() and
1304-
subEdgeIncludingDestructors(memberNode, memberPos, succNode, succPos)
1305+
subEdgeIncludingDestructors(memberPos, memberNode, succNode, succPos)
13051306
)
13061307
}
13071308

@@ -1317,7 +1318,7 @@ private predicate precedesCondition(Node memberNode, Pos memberPos, Node test) {
13171318
or
13181319
exists(Node succNode, Pos succPos |
13191320
precedesCondition(succNode, succPos, test) and
1320-
subEdgeIncludingDestructors(memberNode, memberPos, succNode, succPos) and
1321+
subEdgeIncludingDestructors(memberPos, memberNode, succNode, succPos) and
13211322
// Unlike the similar TC in normalGroupMember we're here including the
13221323
// At-node in the group. This should generalize better to the case where
13231324
// the base case isn't always an After-node.
@@ -1355,7 +1356,7 @@ private module Cached {
13551356
cached
13561357
predicate qlCFGSuccessor(Node n1, Node n2) {
13571358
exists(Node memberNode, Pos memberPos |
1358-
subEdgeIncludingDestructors(n1, any(Pos at | at.isAt()), memberNode, memberPos) and
1359+
subEdgeIncludingDestructors(any(Pos at | at.isAt()), n1, memberNode, memberPos) and
13591360
normalGroupMember(memberNode, memberPos, n2)
13601361
)
13611362
or

0 commit comments

Comments
 (0)