(&mut self)
| 206 | } |
| 207 | |
| 208 | pub(super) fn commit_block(&mut self) { |
| 209 | let Some(j) = self.join_stack.pop() else { return }; |
| 210 | let post = self.ssa_versions.clone(); |
| 211 | |
| 212 | let (a, b) = match j.then { |
| 213 | Some(t) => (t, post), |
| 214 | None => (post, j.backup.clone()), |
| 215 | }; |
| 216 | |
| 217 | let mut divergent: Vec<&String> = a |
| 218 | .keys() |
| 219 | .chain(b.keys()) |
| 220 | .filter(|name| a.get(*name).unwrap_or(&0) != b.get(*name).unwrap_or(&0)) |
| 221 | .collect(); |
| 222 | |
| 223 | // Sort for deterministic Phi order; dedup chain() duplicates from shared vars. |
| 224 | divergent.sort(); |
| 225 | divergent.dedup(); |
| 226 | |
| 227 | for name in divergent { |
| 228 | let va = *a.get(name).unwrap_or(&0); |
| 229 | let vb = *b.get(name).unwrap_or(&0); |
| 230 | let mut ba = [0u8; 128]; |
| 231 | let mut bb = [0u8; 128]; |
| 232 | let mut bx = [0u8; 128]; |
| 233 | let ia = self.chunk.push_name(Self::ssa_name(name, va, &mut ba)); |
| 234 | let ib = self.chunk.push_name(Self::ssa_name(name, vb, &mut bb)); |
| 235 | let v = self.increment_version(name); |
| 236 | let ix = self.chunk.push_name(Self::ssa_name(name, v, &mut bx)); |
| 237 | |
| 238 | self.chunk.phi_sources.push((ia, ib)); |
| 239 | self.chunk.emit(OpCode::Phi, ix); |
| 240 | } |
| 241 | } |
| 242 | } |
| 243 | |
| 244 | // Token-stream utilities: advance, peek, eat, diagnostics. |
no test coverage detected