(&self)
| 220 | } |
| 221 | |
| 222 | fn topo_sorted_values(&self) -> Vec<Value> { |
| 223 | #[derive(Debug)] |
| 224 | enum Event { |
| 225 | Enter, |
| 226 | Exit, |
| 227 | } |
| 228 | let mut stack = Vec::<(Event, Value)>::new(); |
| 229 | |
| 230 | // Traverse the CFG in pre-order so that, when we look at the |
| 231 | // instructions and operands inside each block, we see value defs before |
| 232 | // uses. |
| 233 | for block in crate::traversals::Dfs::new().pre_order_iter(&self.func) { |
| 234 | for inst in self.func.layout.block_insts(block) { |
| 235 | stack.extend(self.func.dfg.inst_values(inst).map(|v| (Event::Enter, v))); |
| 236 | } |
| 237 | } |
| 238 | |
| 239 | // We pushed in the desired order, so popping would implicitly reverse |
| 240 | // that. Avoid that by reversing the initial stack before we start |
| 241 | // traversing the DFG. |
| 242 | stack.reverse(); |
| 243 | |
| 244 | let mut sorted = Vec::with_capacity(self.func.dfg.values().len()); |
| 245 | let mut seen = EntitySet::<Value>::with_capacity(self.func.dfg.values().len()); |
| 246 | |
| 247 | // Post-order traversal of the DFG, visiting value defs before uses. |
| 248 | while let Some((event, value)) = stack.pop() { |
| 249 | match event { |
| 250 | Event::Enter => { |
| 251 | if seen.insert(value) { |
| 252 | stack.push((Event::Exit, value)); |
| 253 | match self.func.dfg.value_def(value) { |
| 254 | ValueDef::Result(inst, _) => { |
| 255 | stack.extend( |
| 256 | self.func |
| 257 | .dfg |
| 258 | .inst_values(inst) |
| 259 | .rev() |
| 260 | .filter(|v| !seen.contains(*v)) |
| 261 | .map(|v| (Event::Enter, v)), |
| 262 | ); |
| 263 | } |
| 264 | ValueDef::Union(a, b) => { |
| 265 | if !seen.contains(b) { |
| 266 | stack.push((Event::Enter, b)); |
| 267 | } |
| 268 | if !seen.contains(a) { |
| 269 | stack.push((Event::Enter, a)); |
| 270 | } |
| 271 | } |
| 272 | ValueDef::Param(..) => {} |
| 273 | } |
| 274 | } |
| 275 | } |
| 276 | Event::Exit => { |
| 277 | sorted.push(value); |
| 278 | } |
| 279 | } |
no test coverage detected