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

Method topo_sorted_values

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

Source from the content-addressed store, hash-verified

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 }

Callers 1

compute_best_valuesMethod · 0.80

Calls 14

pre_order_iterMethod · 0.80
block_instsMethod · 0.80
inst_valuesMethod · 0.80
reverseMethod · 0.80
value_defMethod · 0.80
newFunction · 0.50
extendMethod · 0.45
mapMethod · 0.45
lenMethod · 0.45
valuesMethod · 0.45
popMethod · 0.45
insertMethod · 0.45

Tested by

no test coverage detected