diff --git a/tests/mir-opt/jump_threading.not_int.JumpThreading.panic-abort.diff b/tests/mir-opt/jump_threading.not_int.JumpThreading.panic-abort.diff new file mode 100644 index 0000000000000..e2d1e295f533a --- /dev/null +++ b/tests/mir-opt/jump_threading.not_int.JumpThreading.panic-abort.diff @@ -0,0 +1,46 @@ +- // MIR for `not_int` before JumpThreading ++ // MIR for `not_int` after JumpThreading + + fn not_int() -> i32 { + let mut _0: i32; + let _1: i32; + let mut _2: bool; + let mut _3: i32; + let mut _4: i32; + scope 1 { + debug a => _1; + } + + bb0: { + StorageLive(_1); + _1 = const 1_i32; + StorageLive(_2); + StorageLive(_3); + StorageLive(_4); + _4 = copy _1; + _3 = Not(move _4); + StorageDead(_4); + _2 = Eq(move _3, const 0_i32); +- switchInt(move _2) -> [0: bb2, otherwise: bb1]; ++ goto -> bb1; + } + + bb1: { + StorageDead(_3); + _0 = const 1_i32; + goto -> bb3; + } + + bb2: { + StorageDead(_3); + _0 = const 0_i32; + goto -> bb3; + } + + bb3: { + StorageDead(_2); + StorageDead(_1); + return; + } + } + diff --git a/tests/mir-opt/jump_threading.not_int.JumpThreading.panic-unwind.diff b/tests/mir-opt/jump_threading.not_int.JumpThreading.panic-unwind.diff new file mode 100644 index 0000000000000..e2d1e295f533a --- /dev/null +++ b/tests/mir-opt/jump_threading.not_int.JumpThreading.panic-unwind.diff @@ -0,0 +1,46 @@ +- // MIR for `not_int` before JumpThreading ++ // MIR for `not_int` after JumpThreading + + fn not_int() -> i32 { + let mut _0: i32; + let _1: i32; + let mut _2: bool; + let mut _3: i32; + let mut _4: i32; + scope 1 { + debug a => _1; + } + + bb0: { + StorageLive(_1); + _1 = const 1_i32; + StorageLive(_2); + StorageLive(_3); + StorageLive(_4); + _4 = copy _1; + _3 = Not(move _4); + StorageDead(_4); + _2 = Eq(move _3, const 0_i32); +- switchInt(move _2) -> [0: bb2, otherwise: bb1]; ++ goto -> bb1; + } + + bb1: { + StorageDead(_3); + _0 = const 1_i32; + goto -> bb3; + } + + bb2: { + StorageDead(_3); + _0 = const 0_i32; + goto -> bb3; + } + + bb3: { + StorageDead(_2); + StorageDead(_1); + return; + } + } + diff --git a/tests/mir-opt/jump_threading.rs b/tests/mir-opt/jump_threading.rs index 9487a4e7e5ffe..f62461e225b43 100644 --- a/tests/mir-opt/jump_threading.rs +++ b/tests/mir-opt/jump_threading.rs @@ -531,6 +531,15 @@ fn floats() -> u32 { if x == 0.0 { 0 } else { 1 } } +fn not_int() -> i32 { + // CHECK-LABEL: fn not_int( + + // Test for issue #131195, where !a == b is assumed to be equivalent to a != b + // This is only the case for bools + let a = 1; + if !a == 0 { 1 } else { 0 } +} + fn main() { // CHECK-LABEL: fn main( too_complex(Ok(0)); @@ -546,6 +555,7 @@ fn main() { aggregate(7); assume(7, false); floats(); + not_int(); } // EMIT_MIR jump_threading.too_complex.JumpThreading.diff @@ -562,3 +572,4 @@ fn main() { // EMIT_MIR jump_threading.assume.JumpThreading.diff // EMIT_MIR jump_threading.aggregate_copy.JumpThreading.diff // EMIT_MIR jump_threading.floats.JumpThreading.diff +// EMIT_MIR jump_threading.not_int.JumpThreading.diff