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

Function complex_loop_detection

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

Source from the content-addressed store, hash-verified

368
369 #[test]
370 fn complex_loop_detection() {
371 let mut func = Function::new();
372 let block0 = func.dfg.make_block();
373 let block1 = func.dfg.make_block();
374 let block2 = func.dfg.make_block();
375 let block3 = func.dfg.make_block();
376 let block4 = func.dfg.make_block();
377 let block5 = func.dfg.make_block();
378 let block6 = func.dfg.make_block();
379 let cond = func.dfg.append_block_param(block0, types::I32);
380
381 {
382 let mut cur = FuncCursor::new(&mut func);
383
384 cur.insert_block(block0);
385 cur.ins().brif(cond, block1, &[], block3, &[]);
386
387 cur.insert_block(block1);
388 cur.ins().jump(block2, &[]);
389
390 cur.insert_block(block2);
391 cur.ins().brif(cond, block1, &[], block5, &[]);
392
393 cur.insert_block(block3);
394 cur.ins().jump(block4, &[]);
395
396 cur.insert_block(block4);
397 cur.ins().brif(cond, block3, &[], block5, &[]);
398
399 cur.insert_block(block5);
400 cur.ins().brif(cond, block0, &[], block6, &[]);
401
402 cur.insert_block(block6);
403 cur.ins().return_(&[]);
404 }
405
406 let mut loop_analysis = LoopAnalysis::new();
407 let cfg = ControlFlowGraph::with_function(&func);
408 let domtree = DominatorTree::with_function(&func, &cfg);
409 loop_analysis.compute(&func, &cfg, &domtree);
410
411 let loops = loop_analysis.loops().collect::<Vec<Loop>>();
412 assert_eq!(loops.len(), 3);
413 assert_eq!(loop_analysis.loop_header(loops[0]), block0);
414 assert_eq!(loop_analysis.loop_header(loops[1]), block3);
415 assert_eq!(loop_analysis.loop_header(loops[2]), block1);
416 assert_eq!(loop_analysis.loop_parent(loops[1]), Some(loops[0]));
417 assert_eq!(loop_analysis.loop_parent(loops[2]), Some(loops[0]));
418 assert_eq!(loop_analysis.loop_parent(loops[0]), None);
419 assert_eq!(loop_analysis.is_in_loop(block0, loops[0]), true);
420 assert_eq!(loop_analysis.is_in_loop(block1, loops[2]), true);
421 assert_eq!(loop_analysis.is_in_loop(block2, loops[2]), true);
422 assert_eq!(loop_analysis.is_in_loop(block3, loops[1]), true);
423 assert_eq!(loop_analysis.is_in_loop(block4, loops[1]), true);
424 assert_eq!(loop_analysis.is_in_loop(block5, loops[0]), true);
425 assert_eq!(loop_analysis.loop_level(block0).level(), 1);
426 assert_eq!(loop_analysis.loop_level(block1).level(), 2);
427 assert_eq!(loop_analysis.loop_level(block2).level(), 2);

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