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

Function nested_loops_detection

cranelift/codegen/src/loop_analysis.rs:314–367  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

312
313 #[test]
314 fn nested_loops_detection() {
315 let mut func = Function::new();
316 let block0 = func.dfg.make_block();
317 let block1 = func.dfg.make_block();
318 let block2 = func.dfg.make_block();
319 let block3 = func.dfg.make_block();
320 let block4 = func.dfg.make_block();
321 let cond = func.dfg.append_block_param(block0, types::I32);
322
323 {
324 let mut cur = FuncCursor::new(&mut func);
325
326 cur.insert_block(block0);
327 cur.ins().jump(block1, &[]);
328
329 cur.insert_block(block1);
330 cur.ins().jump(block2, &[]);
331
332 cur.insert_block(block2);
333 cur.ins().brif(cond, block1, &[], block3, &[]);
334
335 cur.insert_block(block3);
336 cur.ins().brif(cond, block0, &[], block4, &[]);
337
338 cur.insert_block(block4);
339 cur.ins().return_(&[]);
340 }
341
342 let mut loop_analysis = LoopAnalysis::new();
343 let mut cfg = ControlFlowGraph::new();
344 let mut domtree = DominatorTree::new();
345 cfg.compute(&func);
346 domtree.compute(&func, &cfg);
347 loop_analysis.compute(&func, &cfg, &domtree);
348
349 let loops = loop_analysis.loops().collect::<Vec<Loop>>();
350 assert_eq!(loops.len(), 2);
351 assert_eq!(loop_analysis.loop_header(loops[0]), block0);
352 assert_eq!(loop_analysis.loop_header(loops[1]), block1);
353 assert_eq!(loop_analysis.loop_parent(loops[1]), Some(loops[0]));
354 assert_eq!(loop_analysis.loop_parent(loops[0]), None);
355 assert_eq!(loop_analysis.is_in_loop(block0, loops[0]), true);
356 assert_eq!(loop_analysis.is_in_loop(block0, loops[1]), false);
357 assert_eq!(loop_analysis.is_in_loop(block1, loops[1]), true);
358 assert_eq!(loop_analysis.is_in_loop(block1, loops[0]), true);
359 assert_eq!(loop_analysis.is_in_loop(block2, loops[1]), true);
360 assert_eq!(loop_analysis.is_in_loop(block2, loops[0]), true);
361 assert_eq!(loop_analysis.is_in_loop(block3, loops[0]), true);
362 assert_eq!(loop_analysis.is_in_loop(block0, loops[1]), false);
363 assert_eq!(loop_analysis.loop_level(block0).level(), 1);
364 assert_eq!(loop_analysis.loop_level(block1).level(), 2);
365 assert_eq!(loop_analysis.loop_level(block2).level(), 2);
366 assert_eq!(loop_analysis.loop_level(block3).level(), 1);
367 }
368
369 #[test]
370 fn complex_loop_detection() {

Callers

nothing calls this directly

Calls 8

make_blockMethod · 0.80
jumpMethod · 0.80
loopsMethod · 0.80
newFunction · 0.50
append_block_paramMethod · 0.45
insert_blockMethod · 0.45
insMethod · 0.45
computeMethod · 0.45

Tested by

no test coverage detected