@@ -651,16 +651,22 @@ pub trait BottomValue {
651651
652652 /// Merges `in_set` into `inout_set`, returning `true` if `inout_set` changed.
653653 ///
654- /// You usually don't need to override this, since it automatically applies
654+ /// It is almost certainly wrong to override this, since it automatically applies
655655 /// * `inout_set & in_set` if `BOTTOM_VALUE == true`
656656 /// * `inout_set | in_set` if `BOTTOM_VALUE == false`
657657 ///
658658 /// This means that if a bit is not `BOTTOM_VALUE`, it is propagated into all target blocks.
659659 /// For clarity, the above statement again from a different perspective:
660- /// A block's initial bit value is `!BOTTOM_VALUE` if *any* predecessor block's bit value is
660+ /// A bit in the block's entry set is `!BOTTOM_VALUE` if *any* predecessor block's bit value is
661661 /// `!BOTTOM_VALUE`.
662+ ///
662663 /// There are situations where you want the opposite behaviour: propagate only if *all*
663- /// predecessor blocks's value is `!BOTTOM_VALUE`. In that case you need to
664+ /// predecessor blocks's value is `!BOTTOM_VALUE`.
665+ /// E.g. if you want to know whether a bit is *definitely* set at a specific location. This
666+ /// means that all code paths leading to the location must have set the bit, instead of any
667+ /// code path leading there.
668+ ///
669+ /// If you want this kind of "definitely set" analysis, you need to
664670 /// 1. Invert `BOTTOM_VALUE`
665671 /// 2. Reset the `entry_set` in `start_block_effect` to `!BOTTOM_VALUE`
666672 /// 3. Override `join` to do the opposite from what it's doing now.
0 commit comments