27 lines
1.2 KiB
Rust
27 lines
1.2 KiB
Rust
//! `passes::compact_vregs` renames the declared parameter types (`Func::param_ints`) with their
|
|
//! vregs: a stale number names another parameter, and the wasm backend narrows a declared
|
|
//! <= 32-bit parameter to i32 (P(DOOM)'s size-first export: a closure's u64 LiveId parameter
|
|
//! took the declared u32 of the pointer before it and lost its high half).
|
|
use relax_backend::passes;
|
|
use relax_backend::rir::*;
|
|
|
|
#[test]
|
|
fn declared_parameter_types_follow_their_renamed_vregs() {
|
|
let mut f = Func::new("compact_param_ints".into(), 0);
|
|
let env = f.vreg(Cls::I);
|
|
let _gone = f.vreg(Cls::I);
|
|
let vm = f.vreg(Cls::I);
|
|
let _gone2 = f.vreg(Cls::I);
|
|
let key = f.vreg(Cls::I);
|
|
f.params = vec![env, vm, key];
|
|
f.param_ints = vec![(env, 4, false), (vm, 4, false), (key, 8, false)];
|
|
f.block();
|
|
let d = f.vreg(Cls::I);
|
|
f.blocks[0].insts.push(Inst::IBin(IOp::Or, IntTy { bits: 64, signed: false }, d, vm, key));
|
|
f.blocks[0].pos.push(0);
|
|
f.blocks[0].term = Term::Ret(vec![]);
|
|
passes::compact_vregs(&mut f);
|
|
assert_eq!(f.params, vec![VReg(0), VReg(1), VReg(2)]);
|
|
let declared: Vec<(VReg, u8)> = f.param_ints.iter().map(|(v, n, _)| (*v, *n)).collect();
|
|
assert_eq!(declared, vec![(VReg(0), 4), (VReg(1), 4), (VReg(2), 8)]);
|
|
}
|