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:
@@ -407,9 +407,15 @@ impl generated_code::Context for IsleContext<'_, '_, MInst, Riscv64Backend> {
|
||||
targets,
|
||||
});
|
||||
}
|
||||
fn x_reg(&mut self, x: u8) -> Reg {
|
||||
x_reg(x as usize)
|
||||
|
||||
fn fp_reg(&mut self) -> PReg {
|
||||
px_reg(8)
|
||||
}
|
||||
|
||||
fn sp_reg(&mut self) -> PReg {
|
||||
px_reg(2)
|
||||
}
|
||||
|
||||
fn shift_int_to_most_significant(&mut self, v: Reg, ty: Type) -> Reg {
|
||||
assert!(ty.is_int() && ty.bits() <= 64);
|
||||
if ty == I64 {
|
||||
|
||||
Reference in New Issue
Block a user