@@ -677,7 +677,8 @@ private predicate ssaFlowImpl(SsaDefOrUse defOrUse, Node nodeFrom, Node nodeTo,
677
677
not nodeFrom = any ( PostUpdateNode pun ) .getPreUpdateNode ( ) and
678
678
nodeToDefOrUse ( nodeFrom , defOrUse , uncertain ) and
679
679
adjacentDefRead ( defOrUse , use ) and
680
- useToNode ( use , nodeTo )
680
+ useToNode ( use , nodeTo ) and
681
+ nodeFrom != nodeTo
681
682
or
682
683
// Initial global variable value to a first use
683
684
nodeFrom .( InitialGlobalValue ) .getGlobalDef ( ) = defOrUse and
@@ -712,11 +713,23 @@ private Node getAPriorDefinition(SsaDefOrUse defOrUse) {
712
713
/** Holds if there is def-use or use-use flow from `nodeFrom` to `nodeTo`. */
713
714
predicate ssaFlow ( Node nodeFrom , Node nodeTo ) {
714
715
exists ( Node nFrom , boolean uncertain , SsaDefOrUse defOrUse |
715
- ssaFlowImpl ( defOrUse , nFrom , nodeTo , uncertain ) and
716
+ ssaFlowImpl ( defOrUse , nFrom , nodeTo , uncertain ) and nodeFrom != nodeTo
717
+ |
716
718
if uncertain = true then nodeFrom = [ nFrom , getAPriorDefinition ( defOrUse ) ] else nodeFrom = nFrom
717
719
)
718
720
}
719
721
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
+
720
733
/**
721
734
* Holds if `use` is a use of `sv` and is a next adjacent use of `phi` in
722
735
* index `i1` in basic block `bb1`.
@@ -742,6 +755,7 @@ predicate fromPhiNode(SsaPhiNode nodeFrom, Node nodeTo) {
742
755
fromPhiNodeToUse ( phi , sv , bb1 , i1 , use )
743
756
or
744
757
exists ( PhiNode phiTo |
758
+ phi != phiTo and
745
759
lastRefRedefExt ( phi , _, _, phiTo ) and
746
760
nodeTo .( SsaPhiNode ) .getPhiNode ( ) = phiTo
747
761
)
0 commit comments