diff --git a/lib/cretonne/src/binemit/relaxation.rs b/lib/cretonne/src/binemit/relaxation.rs index 6ae9b4e4f7..4e6d1a2408 100644 --- a/lib/cretonne/src/binemit/relaxation.rs +++ b/lib/cretonne/src/binemit/relaxation.rs @@ -80,7 +80,8 @@ pub fn relax_branches(func: &mut Function, isa: &TargetIsa) -> Result CodeOffset { let inst = cur.current_inst().unwrap(); dbg!( "Relaxing [{}] {} for {:#x}-{:#x} range", encinfo.display(cur.func.encodings[inst]), - cur.func.dfg.display_inst(inst, None), + cur.func.dfg.display_inst(inst, isa), offset, dest_offset ); + + // Pick the first encoding that can handle the branch range. + let dfg = &cur.func.dfg; + let ctrl_type = dfg.ctrl_typevar(inst); + if let Some(enc) = isa.legal_encodings(dfg, &dfg[inst], ctrl_type).find( + |&enc| { + let range = encinfo.branch_range(enc).expect("Branch with no range"); + let in_range = range.contains(offset, dest_offset); + dbg!( + " trying [{}]: {}", + encinfo.display(enc), + if in_range { "OK" } else { "out of range" } + ); + in_range + }, + ) + { + cur.func.encodings[inst] = enc; + return encinfo.bytes(enc); + } + unimplemented!(); }