Skip to content

Commit 720586c

Browse files
authored
Merge pull request github#13059 from MathiasVP/remove-self-edges
C++: Remove self edges
2 parents c376eeb + 89bf335 commit 720586c

File tree

5 files changed

+17
-1943
lines changed

5 files changed

+17
-1943
lines changed

cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1540,7 +1540,7 @@ private module Cached {
15401540
cached
15411541
predicate simpleLocalFlowStep(Node nodeFrom, Node nodeTo) {
15421542
// Post update node -> Node flow
1543-
Ssa::ssaFlow(nodeFrom.(PostUpdateNode).getPreUpdateNode(), nodeTo)
1543+
Ssa::postUpdateFlow(nodeFrom, nodeTo)
15441544
or
15451545
// Def-use/Use-use flow
15461546
Ssa::ssaFlow(nodeFrom, nodeTo)

cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,8 @@ private predicate ssaFlowImpl(SsaDefOrUse defOrUse, Node nodeFrom, Node nodeTo,
677677
not nodeFrom = any(PostUpdateNode pun).getPreUpdateNode() and
678678
nodeToDefOrUse(nodeFrom, defOrUse, uncertain) and
679679
adjacentDefRead(defOrUse, use) and
680-
useToNode(use, nodeTo)
680+
useToNode(use, nodeTo) and
681+
nodeFrom != nodeTo
681682
or
682683
// Initial global variable value to a first use
683684
nodeFrom.(InitialGlobalValue).getGlobalDef() = defOrUse and
@@ -712,11 +713,23 @@ private Node getAPriorDefinition(SsaDefOrUse defOrUse) {
712713
/** Holds if there is def-use or use-use flow from `nodeFrom` to `nodeTo`. */
713714
predicate ssaFlow(Node nodeFrom, Node nodeTo) {
714715
exists(Node nFrom, boolean uncertain, SsaDefOrUse defOrUse |
715-
ssaFlowImpl(defOrUse, nFrom, nodeTo, uncertain) and
716+
ssaFlowImpl(defOrUse, nFrom, nodeTo, uncertain) and nodeFrom != nodeTo
717+
|
716718
if uncertain = true then nodeFrom = [nFrom, getAPriorDefinition(defOrUse)] else nodeFrom = nFrom
717719
)
718720
}
719721

722+
predicate postUpdateFlow(PostUpdateNode pun, Node nodeTo) {
723+
exists(Node preUpdate, Node nFrom, boolean uncertain, SsaDefOrUse defOrUse |
724+
preUpdate = pun.getPreUpdateNode() and
725+
ssaFlowImpl(defOrUse, nFrom, nodeTo, uncertain)
726+
|
727+
if uncertain = true
728+
then preUpdate = [nFrom, getAPriorDefinition(defOrUse)]
729+
else preUpdate = nFrom
730+
)
731+
}
732+
720733
/**
721734
* Holds if `use` is a use of `sv` and is a next adjacent use of `phi` in
722735
* index `i1` in basic block `bb1`.
@@ -742,6 +755,7 @@ predicate fromPhiNode(SsaPhiNode nodeFrom, Node nodeTo) {
742755
fromPhiNodeToUse(phi, sv, bb1, i1, use)
743756
or
744757
exists(PhiNode phiTo |
758+
phi != phiTo and
745759
lastRefRedefExt(phi, _, _, phiTo) and
746760
nodeTo.(SsaPhiNode).getPhiNode() = phiTo
747761
)

0 commit comments

Comments
 (0)