MCPcopy Create free account
hub / github.com/bytecodealliance/wasmtime / process_elab_stack

Method process_elab_stack

cranelift/codegen/src/egraph/elaborate.rs:451–747  ·  view source on GitHub ↗
(&mut self)

Source from the content-addressed store, hash-verified

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]

Callers 1

elaborate_eclass_useMethod · 0.80

Calls 15

value_defMethod · 0.80
inst_valuesMethod · 0.80
is_in_loopMethod · 0.80
saturating_subMethod · 0.80
depthMethod · 0.80
inst_blockMethod · 0.80
last_instMethod · 0.80
clone_instMethod · 0.80
overwrite_inst_valuesMethod · 0.80
popMethod · 0.45
getMethod · 0.45

Tested by

no test coverage detected