@@ -162,9 +162,25 @@ module Make<LocationSig Location, InputSig<Location> Input> {
162
162
163
163
/**
164
164
* Holds if basic block `succ` is immediately controlled by this basic
165
- * block with conditional value `s`. That is, `succ` is an immediate
166
- * successor of this block, and `succ` can only be reached from
167
- * the callable entry point by going via the `s` edge out of this basic block.
165
+ * block with successor type `s`. That is, `succ` is an immediate successor
166
+ * of this block, and `succ` can only be reached from the entry block by
167
+ * going via the `s` edge out of this basic block.
168
+ *
169
+ * The above implies that this block immediately dominates `succ`. But
170
+ * "controls" is a stronger notion than "dominates". It is not the case
171
+ * that any immediate successor that is immediately dominated by this block
172
+ * is also immediately controlled by this block. To see why, consider this
173
+ * example corresponding to an `if`-statement without an `else` block:
174
+ * ```
175
+ * ... --> cond --[true]--> ... --> if stmt
176
+ * \ /
177
+ * ----[false]-----------
178
+ * ```
179
+ * The basic block for `cond` immediately dominates the immediately
180
+ * succeeding basic block for the `if` statement. But the `if` statement
181
+ * is not immediately controlled by the `cond` basic block and the `false`
182
+ * edge since it is also possible to reach the `if` statement via a path
183
+ * through the `true` edge.
168
184
*/
169
185
pragma [ nomagic]
170
186
predicate immediatelyControls ( BasicBlock succ , SuccessorType s ) {
@@ -176,8 +192,8 @@ module Make<LocationSig Location, InputSig<Location> Input> {
176
192
177
193
/**
178
194
* Holds if basic block `controlled` is controlled by this basic block with
179
- * conditional value `s`. That is, `controlled` can only be reached from
180
- * the callable entry point by going via the `s` edge out of this basic block.
195
+ * successor type `s`. That is, `controlled` can only be reached from the
196
+ * entry point by going via the `s` edge out of this basic block.
181
197
*/
182
198
predicate controls ( BasicBlock controlled , SuccessorType s ) {
183
199
// For this block to control the block `controlled` with `s` the following must be true:
0 commit comments