mir-opt: Do not create storage marks for temporary locals
This commit is contained in:
parent
145d2266d9
commit
8c7faa6ed1
7 changed files with 8 additions and 69 deletions
|
|
@ -128,28 +128,20 @@ impl<'tcx> crate::MirPass<'tcx> for EarlyOtherwiseBranch {
|
|||
|
||||
let mut patch = MirPatch::new(body);
|
||||
|
||||
let (second_discriminant_temp, second_operand) = if opt_data.need_hoist_discriminant {
|
||||
let second_operand = if opt_data.need_hoist_discriminant {
|
||||
// create temp to store second discriminant in, `_s` in example above
|
||||
let second_discriminant_temp =
|
||||
patch.new_temp(opt_data.child_ty, opt_data.child_source.span);
|
||||
|
||||
patch.add_statement(
|
||||
parent_end,
|
||||
StatementKind::StorageLive(second_discriminant_temp),
|
||||
);
|
||||
|
||||
// create assignment of discriminant
|
||||
patch.add_assign(
|
||||
parent_end,
|
||||
Place::from(second_discriminant_temp),
|
||||
Rvalue::Discriminant(opt_data.child_place),
|
||||
);
|
||||
(
|
||||
Some(second_discriminant_temp),
|
||||
Operand::Move(Place::from(second_discriminant_temp)),
|
||||
)
|
||||
Operand::Move(Place::from(second_discriminant_temp))
|
||||
} else {
|
||||
(None, Operand::Copy(opt_data.child_place))
|
||||
Operand::Copy(opt_data.child_place)
|
||||
};
|
||||
|
||||
// create temp to store inequality comparison between the two discriminants, `_t` in
|
||||
|
|
@ -157,7 +149,6 @@ impl<'tcx> crate::MirPass<'tcx> for EarlyOtherwiseBranch {
|
|||
let nequal = BinOp::Ne;
|
||||
let comp_res_type = nequal.ty(tcx, parent_ty, opt_data.child_ty);
|
||||
let comp_temp = patch.new_temp(comp_res_type, opt_data.child_source.span);
|
||||
patch.add_statement(parent_end, StatementKind::StorageLive(comp_temp));
|
||||
|
||||
// create inequality comparison
|
||||
let comp_rvalue =
|
||||
|
|
@ -193,42 +184,13 @@ impl<'tcx> crate::MirPass<'tcx> for EarlyOtherwiseBranch {
|
|||
let eq_bb = patch.new_block(eq_switch);
|
||||
|
||||
// Jump to it on the basis of the inequality comparison
|
||||
let mut true_case = opt_data.destination;
|
||||
let mut false_case = eq_bb;
|
||||
// Create an indirect BB to add `StorageDead` If the jump target is itself.
|
||||
for bb in [&mut false_case, &mut true_case].into_iter() {
|
||||
if *bb == parent {
|
||||
*bb = patch.new_block(BasicBlockData::new(
|
||||
Some(Terminator {
|
||||
kind: TerminatorKind::Goto { target: parent },
|
||||
source_info: bbs[parent].terminator().source_info,
|
||||
}),
|
||||
bbs[parent].is_cleanup,
|
||||
));
|
||||
}
|
||||
}
|
||||
let true_case = opt_data.destination;
|
||||
let false_case = eq_bb;
|
||||
patch.patch_terminator(
|
||||
parent,
|
||||
TerminatorKind::if_(Operand::Move(Place::from(comp_temp)), true_case, false_case),
|
||||
);
|
||||
|
||||
if let Some(second_discriminant_temp) = second_discriminant_temp {
|
||||
// generate StorageDead for the second_discriminant_temp not in use anymore
|
||||
patch.add_statement(
|
||||
parent_end,
|
||||
StatementKind::StorageDead(second_discriminant_temp),
|
||||
);
|
||||
}
|
||||
|
||||
// Generate a StorageDead for comp_temp in each of the targets, since we moved it into
|
||||
// the switch
|
||||
for bb in [false_case, true_case].into_iter() {
|
||||
patch.add_statement(
|
||||
Location { block: bb, statement_index: 0 },
|
||||
StatementKind::StorageDead(comp_temp),
|
||||
);
|
||||
}
|
||||
|
||||
patch.apply(body);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,16 +32,12 @@
|
|||
StorageDead(_4);
|
||||
_9 = discriminant((_3.0: Option2<u32>));
|
||||
- switchInt(move _9) -> [0: bb2, 1: bb3, 2: bb4, otherwise: bb9];
|
||||
+ StorageLive(_12);
|
||||
+ _12 = discriminant((_3.1: Option2<bool>));
|
||||
+ StorageLive(_13);
|
||||
+ _13 = Ne(copy _9, move _12);
|
||||
+ StorageDead(_12);
|
||||
+ switchInt(move _13) -> [0: bb7, otherwise: bb1];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
+ StorageDead(_13);
|
||||
_0 = const 1_u32;
|
||||
- goto -> bb8;
|
||||
+ goto -> bb5;
|
||||
|
|
@ -100,7 +96,6 @@
|
|||
+ }
|
||||
+
|
||||
+ bb7: {
|
||||
+ StorageDead(_13);
|
||||
+ switchInt(copy _9) -> [0: bb4, 1: bb3, 2: bb2, otherwise: bb6];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,16 +32,12 @@
|
|||
StorageDead(_4);
|
||||
_9 = discriminant((_3.0: Option2<u32>));
|
||||
- switchInt(move _9) -> [0: bb2, 1: bb3, 2: bb4, otherwise: bb9];
|
||||
+ StorageLive(_12);
|
||||
+ _12 = discriminant((_3.1: Option2<u32>));
|
||||
+ StorageLive(_13);
|
||||
+ _13 = Ne(copy _9, move _12);
|
||||
+ StorageDead(_12);
|
||||
+ switchInt(move _13) -> [0: bb7, otherwise: bb1];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
+ StorageDead(_13);
|
||||
_0 = const 1_u32;
|
||||
- goto -> bb8;
|
||||
+ goto -> bb5;
|
||||
|
|
@ -100,7 +96,6 @@
|
|||
+ }
|
||||
+
|
||||
+ bb7: {
|
||||
+ StorageDead(_13);
|
||||
+ switchInt(copy _9) -> [0: bb4, 1: bb3, 2: bb2, otherwise: bb6];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,13 +20,11 @@
|
|||
StorageDead(_5);
|
||||
StorageDead(_4);
|
||||
- switchInt(copy (_3.0: u32)) -> [1: bb2, 2: bb3, 3: bb4, otherwise: bb1];
|
||||
+ StorageLive(_6);
|
||||
+ _6 = Ne(copy (_3.0: u32), copy (_3.1: u32));
|
||||
+ switchInt(move _6) -> [0: bb6, otherwise: bb1];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
+ StorageDead(_6);
|
||||
_0 = const 0_u32;
|
||||
- goto -> bb8;
|
||||
+ goto -> bb5;
|
||||
|
|
@ -70,7 +68,6 @@
|
|||
- bb8: {
|
||||
- StorageDead(_3);
|
||||
- return;
|
||||
+ StorageDead(_6);
|
||||
+ switchInt(copy (_3.0: u32)) -> [1: bb4, 2: bb3, 3: bb2, otherwise: bb1];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -132,6 +132,8 @@ fn opt5_failed_type(x: u32, y: u64) -> u32 {
|
|||
#[custom_mir(dialect = "runtime")]
|
||||
fn target_self(val: i32) {
|
||||
// CHECK-LABEL: fn target_self(
|
||||
// CHECK: Ne(
|
||||
// CHECK-NEXT: switchInt
|
||||
mir! {
|
||||
{
|
||||
Goto(bb1)
|
||||
|
|
|
|||
|
|
@ -11,9 +11,8 @@
|
|||
|
||||
bb1: {
|
||||
- switchInt(copy _1) -> [0: bb2, otherwise: bb1];
|
||||
+ StorageLive(_2);
|
||||
+ _2 = Ne(copy _1, copy _1);
|
||||
+ switchInt(move _2) -> [0: bb3, otherwise: bb4];
|
||||
+ switchInt(move _2) -> [0: bb3, otherwise: bb1];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
|
|
@ -23,13 +22,7 @@
|
|||
|
||||
bb3: {
|
||||
- return;
|
||||
+ StorageDead(_2);
|
||||
+ switchInt(copy _1) -> [0: bb2, otherwise: bb1];
|
||||
+ }
|
||||
+
|
||||
+ bb4: {
|
||||
+ StorageDead(_2);
|
||||
+ goto -> bb1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -42,16 +42,12 @@
|
|||
StorageDead(_5);
|
||||
_14 = discriminant((_4.0: Option2<u32>));
|
||||
- switchInt(move _14) -> [0: bb2, 1: bb4, 2: bb6, otherwise: bb12];
|
||||
+ StorageLive(_18);
|
||||
+ _18 = discriminant((_4.1: Option2<u32>));
|
||||
+ StorageLive(_19);
|
||||
+ _19 = Ne(copy _14, move _18);
|
||||
+ StorageDead(_18);
|
||||
+ switchInt(move _19) -> [0: bb10, otherwise: bb1];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
+ StorageDead(_19);
|
||||
_0 = const 1_u32;
|
||||
- goto -> bb11;
|
||||
+ goto -> bb8;
|
||||
|
|
@ -134,7 +130,6 @@
|
|||
+ }
|
||||
+
|
||||
+ bb10: {
|
||||
+ StorageDead(_19);
|
||||
+ switchInt(copy _14) -> [0: bb2, 1: bb3, 2: bb4, otherwise: bb9];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue