Skip to content

Commit

Permalink
Always take advantage of arithmetic identities
Browse files Browse the repository at this point in the history
  • Loading branch information
saethlin committed Jan 2, 2023
1 parent 574b64a commit 82f0973
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 5 deletions.
6 changes: 1 addition & 5 deletions compiler/rustc_mir_transform/src/const_prop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -655,11 +655,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
return None;
}

if self.tcx.sess.mir_opt_level() >= 4 {
self.eval_rvalue_with_identities(rvalue, place)
} else {
self.use_ecx(|this| this.ecx.eval_rvalue_into_place(rvalue, place))
}
self.eval_rvalue_with_identities(rvalue, place)
}

// Attempt to use algebraic identities to eliminate constant expressions
Expand Down
17 changes: 17 additions & 0 deletions src/test/mir-opt/div_overflow.const_dividend.PreCodegen.after.mir
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// MIR for `const_dividend` after PreCodegen

fn const_dividend(_1: i32) -> i32 {
debug a => _1; // in scope 0 at $DIR/div_overflow.rs:+0:23: +0:24
let mut _0: i32; // return place in scope 0 at $DIR/div_overflow.rs:+0:34: +0:37
let mut _2: bool; // in scope 0 at $DIR/div_overflow.rs:+1:5: +1:12

bb0: {
_2 = Eq(_1, const 0_i32); // scope 0 at $DIR/div_overflow.rs:+1:5: +1:12
assert(!move _2, "attempt to divide `{}` by zero", const 256_i32) -> bb1; // scope 0 at $DIR/div_overflow.rs:+1:5: +1:12
}

bb1: {
_0 = Div(const 256_i32, move _1); // scope 0 at $DIR/div_overflow.rs:+1:5: +1:12
return; // scope 0 at $DIR/div_overflow.rs:+2:2: +2:2
}
}
11 changes: 11 additions & 0 deletions src/test/mir-opt/div_overflow.const_divisor.PreCodegen.after.mir
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// MIR for `const_divisor` after PreCodegen

fn const_divisor(_1: i32) -> i32 {
debug a => _1; // in scope 0 at $DIR/div_overflow.rs:+0:22: +0:23
let mut _0: i32; // return place in scope 0 at $DIR/div_overflow.rs:+0:33: +0:36

bb0: {
_0 = Div(move _1, const 256_i32); // scope 0 at $DIR/div_overflow.rs:+1:5: +1:12
return; // scope 0 at $DIR/div_overflow.rs:+2:2: +2:2
}
}
18 changes: 18 additions & 0 deletions src/test/mir-opt/div_overflow.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// compile-flags: -Copt-level=0 -Coverflow-checks=yes

// Tests that division with a const does not emit a panicking branch for overflow

// EMIT_MIR div_overflow.const_divisor.PreCodegen.after.mir
pub fn const_divisor(a: i32) -> i32 {
a / 256
}

// EMIT_MIR div_overflow.const_dividend.PreCodegen.after.mir
pub fn const_dividend(a: i32) -> i32 {
256 / a
}

fn main() {
const_divisor(123);
const_dividend(123);
}

0 comments on commit 82f0973

Please sign in to comment.