(&mut self)
| 449 | } |
| 450 | |
| 451 | fn process_elab_stack(&mut self) { |
| 452 | while let Some(entry) = self.elab_stack.pop() { |
| 453 | match entry { |
| 454 | ElabStackEntry::Start { value, before } => { |
| 455 | debug_assert!(self.func.dfg.value_is_real(value)); |
| 456 | |
| 457 | self.stats.elaborate_visit_node += 1; |
| 458 | |
| 459 | // Get the best option; we use `value` (latest |
| 460 | // value) here so we have a full view of the |
| 461 | // eclass. |
| 462 | trace!("looking up best value for {}", value); |
| 463 | let BestEntry(_, best_value) = self.value_to_best_value[value]; |
| 464 | trace!("elaborate: value {} -> best {}", value, best_value); |
| 465 | debug_assert_ne!(best_value, Value::reserved_value()); |
| 466 | |
| 467 | if let Some(elab_val) = |
| 468 | self.value_to_elaborated_value.get(&NullCtx, &best_value) |
| 469 | { |
| 470 | // Value is available; use it. |
| 471 | trace!("elaborate: value {} -> {:?}", value, elab_val); |
| 472 | self.stats.elaborate_memoize_hit += 1; |
| 473 | self.elab_result_stack.push(*elab_val); |
| 474 | continue; |
| 475 | } |
| 476 | |
| 477 | self.stats.elaborate_memoize_miss += 1; |
| 478 | |
| 479 | // Now resolve the value to its definition to see |
| 480 | // how we can compute it. |
| 481 | let (inst, result_idx) = match self.func.dfg.value_def(best_value) { |
| 482 | ValueDef::Result(inst, result_idx) => { |
| 483 | trace!( |
| 484 | " -> value {} is result {} of {}", |
| 485 | best_value, result_idx, inst |
| 486 | ); |
| 487 | (inst, result_idx) |
| 488 | } |
| 489 | ValueDef::Param(in_block, _) => { |
| 490 | // We don't need to do anything to compute |
| 491 | // this value; just push its result on the |
| 492 | // result stack (blockparams are already |
| 493 | // available). |
| 494 | trace!(" -> value {} is a blockparam", best_value); |
| 495 | self.elab_result_stack.push(ElaboratedValue { |
| 496 | in_block, |
| 497 | value: best_value, |
| 498 | }); |
| 499 | continue; |
| 500 | } |
| 501 | ValueDef::Union(_, _) => { |
| 502 | panic!("Should never have a Union value as the best value"); |
| 503 | } |
| 504 | }; |
| 505 | |
| 506 | trace!( |
| 507 | " -> result {} of inst {:?}", |
| 508 | result_idx, self.func.dfg.insts[inst] |
no test coverage detected