Function cranelift_codegen::timing::regalloc_checker
source · pub fn regalloc_checker() -> TimingTokenExpand description
Register allocation symbolic verification
Examples found in repository?
src/machinst/compile.rs (line 75)
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
pub fn compile<B: LowerBackend + TargetIsa>(
f: &Function,
b: &B,
abi: Callee<<<B as LowerBackend>::MInst as MachInst>::ABIMachineSpec>,
emit_info: <B::MInst as MachInstEmit>::Info,
sigs: SigSet,
) -> CodegenResult<(VCode<B::MInst>, regalloc2::Output)> {
let machine_env = b.machine_env();
// Compute lowered block order.
let block_order = BlockLoweringOrder::new(f);
// Build the lowering context.
let lower = crate::machinst::Lower::new(
f,
b.flags().clone(),
machine_env,
abi,
emit_info,
block_order,
sigs,
)?;
// Lower the IR.
let vcode = {
log::debug!(
"Number of CLIF instructions to lower: {}",
f.dfg.num_insts()
);
log::debug!("Number of CLIF blocks to lower: {}", f.dfg.num_blocks());
let _tt = timing::vcode_lower();
lower.lower(b)?
};
log::debug!(
"Number of lowered vcode instructions: {}",
vcode.num_insts()
);
log::debug!("Number of lowered vcode blocks: {}", vcode.num_blocks());
trace!("vcode from lowering: \n{:?}", vcode);
// Perform register allocation.
let regalloc_result = {
let _tt = timing::regalloc();
let mut options = RegallocOptions::default();
options.verbose_log = b.flags().regalloc_verbose_logs();
regalloc2::run(&vcode, machine_env, &options)
.map_err(|err| {
log::error!(
"Register allocation error for vcode\n{:?}\nError: {:?}\nCLIF for error:\n{:?}",
vcode,
err,
f,
);
err
})
.expect("register allocation")
};
// Run the regalloc checker, if requested.
if b.flags().regalloc_checker() {
let _tt = timing::regalloc_checker();
let mut checker = regalloc2::checker::Checker::new(&vcode, machine_env);
checker.prepare(®alloc_result);
checker
.run()
.map_err(|err| {
log::error!(
"Register allocation checker errors:\n{:?}\nfor vcode:\n{:?}",
err,
vcode
);
err
})
.expect("register allocation checker");
}
Ok((vcode, regalloc_result))
}