machinst: fix the pinned reg hack;
The pinned register hack didn't work because the GetPinnedReg is marked as having side-effects, so that GVN wouldn't try to common it out. This commit tweaks the function used during lowering to vcode, so that the GetPinnedReg opcode is specially handled. It's a bit lame, but it makes the hack work again. Also, use_input needs to be a no-op for real registers.
This commit is contained in:
@@ -41,9 +41,11 @@ pub fn has_side_effect(func: &Function, inst: Inst) -> bool {
|
||||
trivially_has_side_effects(opcode) || is_load_with_defined_trapping(opcode, data)
|
||||
}
|
||||
|
||||
/// Does the given instruction have any side-effect as per [has_side_effect], or else is a load?
|
||||
pub fn has_side_effect_or_load(func: &Function, inst: Inst) -> bool {
|
||||
has_side_effect(func, inst) || func.dfg[inst].opcode().can_load()
|
||||
/// Does the given instruction have any side-effect as per [has_side_effect], or else is a load,
|
||||
/// but not the get_pinned_reg opcode?
|
||||
pub fn has_side_effect_or_load_not_get_pinned_reg(func: &Function, inst: Inst) -> bool {
|
||||
let op = func.dfg[inst].opcode();
|
||||
op != Opcode::GetPinnedReg && (has_side_effect(func, inst) || op.can_load())
|
||||
}
|
||||
|
||||
/// Is the given instruction a constant value (`iconst`, `fconst`, `bconst`) that can be
|
||||
|
||||
Reference in New Issue
Block a user