Browse Source

Fix handling of jumps in bugpoint (#5794)

Fixes #5792
pull/5798/head
Trevor Elliott 2 years ago
committed by GitHub
parent
commit
aba239e9b8
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 39
      cranelift/src/bugpoint.rs

39
cranelift/src/bugpoint.rs

@ -709,32 +709,31 @@ impl Mutator for MergeBlocks {
let pred = cfg.pred_iter(block).next().unwrap();
// If the branch instruction that lead us to this block is preceded by another branch
// instruction, then we have a conditional jump sequence that we should not break by
// replacing the second instruction by more of them.
if let Some(pred_pred_inst) = func.layout.prev_inst(pred.inst) {
if func.dfg.insts[pred_pred_inst].opcode().is_branch() {
return Some((
func,
format!("did nothing for {}", block),
ProgressStatus::Skip,
));
}
// If the branch instruction that lead us to this block wasn't an unconditional jump, then
// we have a conditional jump sequence that we should not break.
let branch_dests = func.dfg.insts[pred.inst].branch_destination();
if branch_dests.len() != 1 {
return Some((
func,
format!("did nothing for {}", block),
ProgressStatus::Skip,
));
}
assert!(func.dfg.block_params(block).len() == func.dfg.inst_variable_args(pred.inst).len());
let branch_args = branch_dests[0].args_slice(&func.dfg.value_lists).to_vec();
// If there were any block parameters in block, then the last instruction in pred will
// fill these parameters. Make the block params aliases of the terminator arguments.
for (block_param, arg) in func
// TODO: should we free the entity list associated with the block params?
let block_params = func
.dfg
.detach_block_params(block)
.as_slice(&func.dfg.value_lists)
.iter()
.cloned()
.zip(func.dfg.inst_variable_args(pred.inst).iter().cloned())
.collect::<Vec<_>>()
{
.to_vec();
assert_eq!(block_params.len(), branch_args.len());
// If there were any block parameters in block, then the last instruction in pred will
// fill these parameters. Make the block params aliases of the terminator arguments.
for (block_param, arg) in block_params.into_iter().zip(branch_args) {
if block_param != arg {
func.dfg.change_to_alias(block_param, arg);
}

Loading…
Cancel
Save