Assert that we only use virtual registers with moves (#5440)
Assert that we never see real registers as arguments to move instructions in VCodeBuilder::collect_operands. Also fix a bug in the riscv64 backend that was discovered by these assertions: the lowerings of get_stack_pointer and get_frame_pointer were using physical registers 8 and 2 directly. The solution was similar to other backends: add a move instruction specifically for moving out of physical registers, whose source operand is opaque to regalloc2.
This commit is contained in:
@@ -1123,6 +1123,19 @@ impl MachInstEmit for Inst {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&Inst::MovFromPReg { rd, rm } => {
|
||||
debug_assert!([px_reg(2), px_reg(8)].contains(&rm));
|
||||
let rd = allocs.next_writable(rd);
|
||||
let x = Inst::AluRRImm12 {
|
||||
alu_op: AluOPRRI::Ori,
|
||||
rd,
|
||||
rs: Reg::from(rm),
|
||||
imm12: Imm12::zero(),
|
||||
};
|
||||
x.emit(&[], sink, emit_info, state);
|
||||
}
|
||||
|
||||
&Inst::BrTable {
|
||||
index,
|
||||
tmp1,
|
||||
|
||||
Reference in New Issue
Block a user