@@ -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`. */
713714predicate 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