makepad/libs/relax/backend/tests/compact_param_ints.rs

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)]);
}