Skip to content

Commit

Permalink
Rollup merge of rust-lang#63431 - andjo403:revert_mir_simplification,…
Browse files Browse the repository at this point in the history
… r=matthewjasper

Revert "Simplify MIR generation for logical ops"

This reverts commit e38e954.

llvm were not able to optimize the code that well with the simplified mir.

Closes: rust-lang#62993
  • Loading branch information
Centril authored Aug 12, 2019
2 parents 83e1e1f + 676953f commit ecfca80
Showing 1 changed file with 30 additions and 23 deletions.
53 changes: 30 additions & 23 deletions src/librustc_mir/build/expr/into.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,59 +79,66 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
ExprKind::LogicalOp { op, lhs, rhs } => {
// And:
//
// [block: If(lhs)] -true-> [else_block: dest = (rhs)]
// | (false)
// [shortcurcuit_block: dest = false]
// [block: If(lhs)] -true-> [else_block: If(rhs)] -true-> [true_block]
// | | (false)
// +----------false-----------+------------------> [false_block]
//
// Or:
//
// [block: If(lhs)] -false-> [else_block: dest = (rhs)]
// | (true)
// [shortcurcuit_block: dest = true]
// [block: If(lhs)] -false-> [else_block: If(rhs)] -true-> [true_block]
// | (true) | (false)
// [true_block] [false_block]

let (shortcircuit_block, mut else_block, join_block) = (
let (true_block, false_block, mut else_block, join_block) = (
this.cfg.start_new_block(),
this.cfg.start_new_block(),
this.cfg.start_new_block(),
this.cfg.start_new_block(),
);

let lhs = unpack!(block = this.as_local_operand(block, lhs));
let blocks = match op {
LogicalOp::And => (else_block, shortcircuit_block),
LogicalOp::Or => (shortcircuit_block, else_block),
LogicalOp::And => (else_block, false_block),
LogicalOp::Or => (true_block, else_block),
};
let term = TerminatorKind::if_(this.hir.tcx(), lhs, blocks.0, blocks.1);
this.cfg.terminate(block, source_info, term);

let rhs = unpack!(else_block = this.as_local_operand(else_block, rhs));
let term = TerminatorKind::if_(this.hir.tcx(), rhs, true_block, false_block);
this.cfg.terminate(else_block, source_info, term);

this.cfg.push_assign_constant(
shortcircuit_block,
true_block,
source_info,
destination,
Constant {
span: expr_span,
ty: this.hir.bool_ty(),
user_ty: None,
literal: match op {
LogicalOp::And => this.hir.false_literal(),
LogicalOp::Or => this.hir.true_literal(),
},
literal: this.hir.true_literal(),
},
);
this.cfg.terminate(
shortcircuit_block,

this.cfg.push_assign_constant(
false_block,
source_info,
TerminatorKind::Goto { target: join_block },
destination,
Constant {
span: expr_span,
ty: this.hir.bool_ty(),
user_ty: None,
literal: this.hir.false_literal(),
},
);

let rhs = unpack!(else_block = this.as_local_operand(else_block, rhs));
this.cfg.push_assign(
else_block,
this.cfg.terminate(
true_block,
source_info,
destination,
Rvalue::Use(rhs),
TerminatorKind::Goto { target: join_block },
);
this.cfg.terminate(
else_block,
false_block,
source_info,
TerminatorKind::Goto { target: join_block },
);
Expand Down

0 comments on commit ecfca80

Please sign in to comment.