Legalize br_icmp (#449)

* Legalize br_icmp
This commit is contained in:
bjorn3
2018-08-14 03:31:39 +02:00
committed by Dan Gohman
parent bee5210b40
commit 3f582f7cbd
3 changed files with 81 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
test legalizer
target x86_64
function %br_icmp(i64) fast {
ebb0(v0: i64):
v1 = iconst.i64 0
br_icmp eq v0, v1, ebb1
jump ebb1
ebb1:
return
}
; sameln: function %br_icmp(i64 [%rdi]) fast {
; nextln: ebb0(v0: i64):
; nextln: [RexOp1pu_id#b8] v1 = iconst.i64 0
; nextln: [RexOp1icscc#8039] v2 = icmp eq v0, v1
; nextln: [RexOp1t8jccb#75] brnz v2, ebb1
; nextln: [RexOp1jmpb#eb] jump ebb1
; nextln:
; nextln: ebb1:
; nextln: [Op1ret#c3] return
; nextln: }
function %br_icmp_ebb_args(i64) fast {
ebb0(v0: i64):
v1 = iconst.i64 0
br_icmp eq v0, v1, ebb1(v0)
jump ebb1(v0)
ebb1(v2: i64):
return
}
; sameln: function %br_icmp_ebb_args(i64 [%rdi]) fast {
; nextln: ebb0(v0: i64):
; nextln: [RexOp1pu_id#b8] v1 = iconst.i64 0
; nextln: [RexOp1icscc#8039] v3 = icmp eq v0, v1
; nextln: [RexOp1t8jccb#75] brnz v3, ebb1(v0)
; nextln: [RexOp1jmpb#eb] jump ebb1(v0)
; nextln:
; nextln: ebb1(v2: i64):
; nextln: [Op1ret#c3] return
; nextln: }

View File

@@ -407,6 +407,7 @@ for ty, minus_zero in [
a << bor(a1, a2)
))
expand.custom_legalize(insts.br_icmp, 'expand_br_icmp')
# Expansions using CPU flags.

View File

@@ -244,6 +244,40 @@ fn expand_select(
cfg.recompute_ebb(pos.func, old_ebb);
}
fn expand_br_icmp(
inst: ir::Inst,
func: &mut ir::Function,
cfg: &mut ControlFlowGraph,
_isa: &TargetIsa,
) {
let (cond, a, b, destination, ebb_args) = match func.dfg[inst] {
ir::InstructionData::BranchIcmp {
cond,
destination,
ref args,
..
} => (
cond,
args.get(0, &func.dfg.value_lists).unwrap(),
args.get(1, &func.dfg.value_lists).unwrap(),
destination,
args.as_slice(&func.dfg.value_lists)[2..].to_vec(),
),
_ => panic!("Expected br_icmp {}", func.dfg.display_inst(inst, None)),
};
let old_ebb = func.layout.pp_ebb(inst);
func.dfg.clear_results(inst);
let icmp_res = func.dfg.replace(inst).icmp(cond, a, b);
let mut pos = FuncCursor::new(func).after_inst(inst);
pos.use_srcloc(inst);
pos.ins().brnz(icmp_res, destination, &ebb_args);
cfg.recompute_ebb(pos.func, destination);
cfg.recompute_ebb(pos.func, old_ebb);
}
/// Expand illegal `f32const` and `f64const` instructions.
fn expand_fconst(
inst: ir::Inst,