Avoid lowering code under dead SwitchInt targets
This commit is contained in:
parent
a165f1f650
commit
81d630453b
6 changed files with 214 additions and 4 deletions
|
@ -1237,6 +1237,16 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn codegen_block_as_unreachable(&mut self, bb: mir::BasicBlock) {
|
||||
let llbb = match self.try_llbb(bb) {
|
||||
Some(llbb) => llbb,
|
||||
None => return,
|
||||
};
|
||||
let bx = &mut Bx::build(self.cx, llbb);
|
||||
debug!("codegen_block_as_unreachable({:?})", bb);
|
||||
bx.unreachable();
|
||||
}
|
||||
|
||||
fn codegen_terminator(
|
||||
&mut self,
|
||||
bx: &mut Bx,
|
||||
|
|
|
@ -256,13 +256,22 @@ pub fn codegen_mir<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||
// Apply debuginfo to the newly allocated locals.
|
||||
fx.debug_introduce_locals(&mut start_bx);
|
||||
|
||||
let reachable_blocks = mir.reachable_blocks_in_mono(cx.tcx(), instance);
|
||||
|
||||
// The builders will be created separately for each basic block at `codegen_block`.
|
||||
// So drop the builder of `start_llbb` to avoid having two at the same time.
|
||||
drop(start_bx);
|
||||
|
||||
// Codegen the body of each block using reverse postorder
|
||||
for (bb, _) in traversal::reverse_postorder(mir) {
|
||||
fx.codegen_block(bb);
|
||||
if reachable_blocks.contains(bb) {
|
||||
fx.codegen_block(bb);
|
||||
} else {
|
||||
// This may have references to things we didn't monomorphize, so we
|
||||
// don't actually codegen the body. We still create the block so
|
||||
// terminators in other blocks can reference it without worry.
|
||||
fx.codegen_block_as_unreachable(bb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue