@@ -127,10 +127,11 @@ private predicate sideEffectCfg(ControlFlow::Node src, ControlFlow::Node dst) {
127127
128128/**
129129 * Holds if `dominator` is the immediate dominator of `node` in
130- * the side-effect CFG.
130+ * the side-effect CFG belonging to `entry` .
131131 */
132- private predicate iDomEffect ( ControlFlow:: Node dominator , ControlFlow:: Node node ) =
133- idominance( entryNode / 1 , sideEffectCfg / 2 ) ( _, dominator , node )
132+ private predicate iDomEffect (
133+ ControlFlow:: Node entry , ControlFlow:: Node dominator , ControlFlow:: Node node
134+ ) = idominance( entryNode / 1 , sideEffectCfg / 2 ) ( entry , dominator , node )
134135
135136/**
136137 * Gets the most recent side effect. To be more precise, `result` is a
@@ -182,12 +183,15 @@ private predicate iDomEffect(ControlFlow::Node dominator, ControlFlow::Node node
182183 * Therefore, the most recent side effect for line 015 is line 009.
183184 */
184185cached
186+ private ControlFlow:: Node mostRecentSideEffect ( ControlFlow:: Node entry , ControlFlow:: Node node ) {
187+ iDomEffect ( entry , entry , result ) and
188+ result = node
189+ or
190+ iDomEffect ( entry , result , mostRecentSideEffect ( entry , node ) )
191+ }
192+
185193private ControlFlow:: Node mostRecentSideEffect ( ControlFlow:: Node node ) {
186- exists ( ControlFlow:: Node entry |
187- entryNode ( entry ) and
188- iDomEffect ( entry , result ) and
189- iDomEffect * ( result , node )
190- )
194+ result = mostRecentSideEffect ( _, node )
191195}
192196
193197/** Used to represent the "global value number" of an expression. */
0 commit comments