Three fixes to various SpiderMonkey-related issues:
- Properly mask constant values down to appropriate width when generating a constant value directly in aarch64 backend. This was a miscompilation introduced in the new-isel refactor. In combination with failure to respect NarrowValueMode, this resulted in a very subtle bug when an `i32` constant was used in bit-twiddling logic. - Add support for `iadd_ifcout` in aarch64 backend as used in explicit heap-check mode. With this change, we no longer fail heap-related tests with the huge-heap-region mode disabled. - Remove a panic that was occurring in some tests that are currently ignored on aarch64, by simply returning empty/default information in `value_label` functionality rather than touching unimplemented APIs. This is not a bugfix per-se, but removes confusing panic messages from `cargo test` output that might otherwise mislead.
This commit is contained in:
@@ -133,7 +133,7 @@ pub trait LowerCtx {
|
||||
/// Get the `idx`th output register of the given IR instruction. When
|
||||
/// `backend.lower_inst_to_regs(ctx, inst)` is called, it is expected that
|
||||
/// the backend will write results to these output register(s).
|
||||
fn get_output(&mut self, ir_inst: Inst, idx: usize) -> Writable<Reg>;
|
||||
fn get_output(&self, ir_inst: Inst, idx: usize) -> Writable<Reg>;
|
||||
|
||||
// Codegen primitives: allocate temps, emit instructions, set result registers,
|
||||
// ask for an input to be gen'd into a register.
|
||||
@@ -146,6 +146,10 @@ pub trait LowerCtx {
|
||||
/// `get_input()`. Codegen may not happen otherwise for the producing
|
||||
/// instruction if it has no side effects and no uses.
|
||||
fn use_input_reg(&mut self, input: LowerInput);
|
||||
/// Is the given register output needed after the given instruction? Allows
|
||||
/// instructions with multiple outputs to make fine-grained decisions on
|
||||
/// which outputs to actually generate.
|
||||
fn is_reg_needed(&self, ir_inst: Inst, reg: Reg) -> bool;
|
||||
/// Retrieve constant data given a handle.
|
||||
fn get_constant_data(&self, constant_handle: Constant) -> &ConstantData;
|
||||
}
|
||||
@@ -906,7 +910,7 @@ impl<'func, I: VCodeInst> LowerCtx for Lower<'func, I> {
|
||||
self.get_input_for_val(ir_inst, val)
|
||||
}
|
||||
|
||||
fn get_output(&mut self, ir_inst: Inst, idx: usize) -> Writable<Reg> {
|
||||
fn get_output(&self, ir_inst: Inst, idx: usize) -> Writable<Reg> {
|
||||
let val = self.f.dfg.inst_results(ir_inst)[idx];
|
||||
Writable::from_reg(self.value_regs[val])
|
||||
}
|
||||
@@ -928,6 +932,10 @@ impl<'func, I: VCodeInst> LowerCtx for Lower<'func, I> {
|
||||
self.vreg_needed[input.reg.get_index()] = true;
|
||||
}
|
||||
|
||||
fn is_reg_needed(&self, ir_inst: Inst, reg: Reg) -> bool {
|
||||
self.inst_needed[ir_inst] || self.vreg_needed[reg.get_index()]
|
||||
}
|
||||
|
||||
fn get_constant_data(&self, constant_handle: Constant) -> &ConstantData {
|
||||
self.f.dfg.constants.get(constant_handle)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user