Skip to content

Commit

Permalink
Auto merge of #63431 - andjo403:revert_mir_simplification, r=<try>
Browse files Browse the repository at this point in the history
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: #62993
  • Loading branch information
bors committed Aug 10, 2019
2 parents be8bbb0 + 676953f commit 8d93eae
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 8d93eae

Please sign in to comment.