cranelift: Remove redundant branch and select instructions (#5097)
As discussed in the 2022/10/19 meeting, this PR removes many of the branch and select instructions that used iflags, in favor if using brz/brnz and select in their place. Additionally, it reworks selectif_spectre_guard to take an i8 input instead of an iflags input. For reference, the removed instructions are: br_icmp, brif, brff, trueif, trueff, and selectif.
This commit is contained in:
@@ -250,11 +250,11 @@ fn compute_addr(
|
||||
if let Some((cc, a, b)) = spectre_oob_comparison {
|
||||
let final_addr = pos.ins().iadd(base, offset);
|
||||
let zero = pos.ins().iconst(addr_ty, 0);
|
||||
let flags = pos.ins().ifcmp(a, b);
|
||||
let cmp = pos.ins().icmp(cc, a, b);
|
||||
pos.func
|
||||
.dfg
|
||||
.replace(inst)
|
||||
.selectif_spectre_guard(addr_ty, cc, flags, zero, final_addr);
|
||||
.select_spectre_guard(cmp, zero, final_addr);
|
||||
} else {
|
||||
pos.func.dfg.replace(inst).iadd(base, offset);
|
||||
}
|
||||
|
||||
@@ -54,27 +54,6 @@ pub fn simple_legalize(func: &mut ir::Function, cfg: &mut ControlFlowGraph, isa:
|
||||
while let Some(inst) = pos.next_inst() {
|
||||
match pos.func.dfg[inst] {
|
||||
// control flow
|
||||
InstructionData::BranchIcmp {
|
||||
opcode: ir::Opcode::BrIcmp,
|
||||
cond,
|
||||
destination,
|
||||
ref args,
|
||||
} => {
|
||||
let a = args.get(0, &pos.func.dfg.value_lists).unwrap();
|
||||
let b = args.get(1, &pos.func.dfg.value_lists).unwrap();
|
||||
let block_args = args.as_slice(&pos.func.dfg.value_lists)[2..].to_vec();
|
||||
|
||||
let old_block = pos.func.layout.pp_block(inst);
|
||||
pos.func.dfg.clear_results(inst);
|
||||
|
||||
let icmp_res = pos.func.dfg.replace(inst).icmp(cond, a, b);
|
||||
let mut pos = FuncCursor::new(pos.func).after_inst(inst);
|
||||
pos.use_srcloc(inst);
|
||||
pos.ins().brnz(icmp_res, destination, &block_args);
|
||||
|
||||
cfg.recompute_block(pos.func, destination);
|
||||
cfg.recompute_block(pos.func, old_block);
|
||||
}
|
||||
InstructionData::CondTrap {
|
||||
opcode:
|
||||
opcode @ (ir::Opcode::Trapnz | ir::Opcode::Trapz | ir::Opcode::ResumableTrapnz),
|
||||
|
||||
@@ -99,15 +99,11 @@ fn compute_addr(
|
||||
};
|
||||
|
||||
let element_addr = if let Some((index, bound)) = spectre_oob_cmp {
|
||||
let flags = pos.ins().ifcmp(index, bound);
|
||||
let cond = pos
|
||||
.ins()
|
||||
.icmp(IntCC::UnsignedGreaterThanOrEqual, index, bound);
|
||||
// If out-of-bounds, choose the table base on the misspeculation path.
|
||||
pos.ins().selectif_spectre_guard(
|
||||
addr_ty,
|
||||
IntCC::UnsignedGreaterThanOrEqual,
|
||||
flags,
|
||||
base,
|
||||
element_addr,
|
||||
)
|
||||
pos.ins().select_spectre_guard(cond, base, element_addr)
|
||||
} else {
|
||||
element_addr
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user