Cranelift: implement redundant fill removal on tree-shaped CFG regions. Mozilla bug 1570584. (#906)
This commit is contained in:
@@ -9,6 +9,7 @@ use crate::cdsl::settings::SettingGroup;
|
||||
use crate::shared::types::Bool::B1;
|
||||
use crate::shared::types::Float::{F32, F64};
|
||||
use crate::shared::types::Int::{I16, I32, I64, I8};
|
||||
use crate::shared::types::Reference::{R32, R64};
|
||||
use crate::shared::Definitions as SharedDefinitions;
|
||||
|
||||
use super::recipes::RecipeGroup;
|
||||
@@ -121,7 +122,9 @@ pub fn define<'defs>(
|
||||
let call_indirect = shared.by_name("call_indirect");
|
||||
let copy = shared.by_name("copy");
|
||||
let copy_nop = shared.by_name("copy_nop");
|
||||
let copy_to_ssa = shared.by_name("copy_to_ssa");
|
||||
let fill = shared.by_name("fill");
|
||||
let fill_nop = shared.by_name("fill_nop");
|
||||
let iadd = shared.by_name("iadd");
|
||||
let iadd_imm = shared.by_name("iadd_imm");
|
||||
let iconst = shared.by_name("iconst");
|
||||
@@ -141,6 +144,8 @@ pub fn define<'defs>(
|
||||
let return_ = shared.by_name("return");
|
||||
|
||||
// Recipes shorthands, prefixed with r_.
|
||||
let r_copytossa = recipes.by_name("copytossa");
|
||||
let r_fillnull = recipes.by_name("fillnull");
|
||||
let r_icall = recipes.by_name("Icall");
|
||||
let r_icopy = recipes.by_name("Icopy");
|
||||
let r_ii = recipes.by_name("Ii");
|
||||
@@ -368,6 +373,14 @@ pub fn define<'defs>(
|
||||
e.add64(enc(fill.bind(I32), r_gp_fi, load_bits(0b010)));
|
||||
e.add64(enc(fill.bind(I64), r_gp_fi, load_bits(0b011)));
|
||||
|
||||
// No-op fills, created by late-stage redundant-fill removal.
|
||||
for &ty in &[I64, I32] {
|
||||
e.add64(enc(fill_nop.bind(ty), r_fillnull, 0));
|
||||
e.add32(enc(fill_nop.bind(ty), r_fillnull, 0));
|
||||
}
|
||||
e.add64(enc(fill_nop.bind(B1), r_fillnull, 0));
|
||||
e.add32(enc(fill_nop.bind(B1), r_fillnull, 0));
|
||||
|
||||
// Register copies.
|
||||
e.add32(enc(copy.bind(I32), r_icopy, opimm_bits(0b000, 0)));
|
||||
e.add64(enc(copy.bind(I64), r_icopy, opimm_bits(0b000, 0)));
|
||||
@@ -394,5 +407,34 @@ pub fn define<'defs>(
|
||||
e.add64(enc(copy_nop.bind(ty), r_stacknull, 0));
|
||||
}
|
||||
|
||||
// Copy-to-SSA
|
||||
e.add32(enc(
|
||||
copy_to_ssa.bind(I32),
|
||||
r_copytossa,
|
||||
opimm_bits(0b000, 0),
|
||||
));
|
||||
e.add64(enc(
|
||||
copy_to_ssa.bind(I64),
|
||||
r_copytossa,
|
||||
opimm_bits(0b000, 0),
|
||||
));
|
||||
e.add64(enc(
|
||||
copy_to_ssa.bind(I32),
|
||||
r_copytossa,
|
||||
opimm32_bits(0b000, 0),
|
||||
));
|
||||
e.add32(enc(copy_to_ssa.bind(B1), r_copytossa, opimm_bits(0b000, 0)));
|
||||
e.add64(enc(copy_to_ssa.bind(B1), r_copytossa, opimm_bits(0b000, 0)));
|
||||
e.add32(enc(
|
||||
copy_to_ssa.bind_ref(R32),
|
||||
r_copytossa,
|
||||
opimm_bits(0b000, 0),
|
||||
));
|
||||
e.add64(enc(
|
||||
copy_to_ssa.bind_ref(R64),
|
||||
r_copytossa,
|
||||
opimm_bits(0b000, 0),
|
||||
));
|
||||
|
||||
e
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user