Skip to content

Commit 84d3f61

Browse files
committed
Go: Avoid combinatorial explosion in mostRecentSideEffect when there are multiple entry points
1 parent c64223a commit 84d3f61

1 file changed

Lines changed: 12 additions & 8 deletions

File tree

go/ql/lib/semmle/go/dataflow/GlobalValueNumbering.qll

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
184185
cached
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+
185193
private 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

Comments
 (0)