1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use bitflags;
use FxHashMap;
use SymbolId;
bitflags!
/// Program-wide, monotone facts about symbols, keyed by `SymbolId`.
///
/// Lifecycle contract (also the fit criterion for any future [`SymbolFact`] bit):
/// - seeded by `Normalize` before the fixed-point loop, so membership is
/// execution-order independent (a per-pass set populated during the same
/// traversal that drops writes would be traversal-order dependent);
/// - extended mid-loop only where a pass CREATES a new fact instance (e.g.
/// forming a new compound assignment in `mark_assignment_target_as_read`);
/// - monotone: bits are only ever set, never cleared —
/// `PeepholeOptimizations::enter_program` deliberately leaves it alone;
/// - staleness is sound: a SET bit whose hazard has since been optimized away
/// only FORGOES an optimization, never enables a wrong one. A fact belongs
/// here only if that holds for it. (The reverse direction — a MISSING bit —
/// is unsound to act on, which is exactly why seeding must complete before
/// the loop and why creation sites must insert eagerly; monotonicity does
/// not cover it.)