Add test.

This commit is contained in:
Camille Gillot
2025-09-16 22:44:35 +00:00
parent f018b46558
commit de73af9ec4
8 changed files with 724 additions and 1 deletions
@@ -0,0 +1,155 @@
// MIR for `const_array_len` after built
fn const_array_len(_1: [T; 5]) -> () {
debug x => _1;
let mut _0: ();
let _6: ();
let mut _7: T;
let _8: ();
let mut _9: T;
let _10: ();
let mut _11: [T; 2];
let _12: ();
let mut _13: T;
scope 1 {
debug a => _2;
debug b => _3;
debug rest => _4;
debug e => _5;
let _2: T;
let _3: T;
let _4: [T; 2];
let _5: T;
}
bb0: {
PlaceMention(_1);
falseEdge -> [real: bb2, imaginary: bb1];
}
bb1: {
goto -> bb7;
}
bb2: {
StorageLive(_2);
_2 = move _1[0 of 5];
StorageLive(_3);
_3 = move _1[1 of 5];
StorageLive(_4);
_4 = move _1[2..4];
StorageLive(_5);
_5 = move _1[4 of 5];
StorageLive(_6);
StorageLive(_7);
_7 = move _2;
_6 = opaque::<T>(move _7) -> [return: bb3, unwind: bb17];
}
bb3: {
StorageDead(_7);
StorageDead(_6);
StorageLive(_8);
StorageLive(_9);
_9 = move _3;
_8 = opaque::<T>(move _9) -> [return: bb4, unwind: bb16];
}
bb4: {
StorageDead(_9);
StorageDead(_8);
StorageLive(_10);
StorageLive(_11);
_11 = move _4;
_10 = opaque::<[T; 2]>(move _11) -> [return: bb5, unwind: bb15];
}
bb5: {
StorageDead(_11);
StorageDead(_10);
StorageLive(_12);
StorageLive(_13);
_13 = move _5;
_12 = opaque::<T>(move _13) -> [return: bb6, unwind: bb14];
}
bb6: {
StorageDead(_13);
StorageDead(_12);
_0 = const ();
drop(_5) -> [return: bb8, unwind: bb19];
}
bb7: {
_0 = const ();
goto -> bb12;
}
bb8: {
StorageDead(_5);
drop(_4) -> [return: bb9, unwind: bb20];
}
bb9: {
StorageDead(_4);
drop(_3) -> [return: bb10, unwind: bb21];
}
bb10: {
StorageDead(_3);
drop(_2) -> [return: bb11, unwind: bb22];
}
bb11: {
StorageDead(_2);
goto -> bb12;
}
bb12: {
drop(_1) -> [return: bb13, unwind: bb23];
}
bb13: {
return;
}
bb14 (cleanup): {
drop(_13) -> [return: bb18, unwind terminate(cleanup)];
}
bb15 (cleanup): {
drop(_11) -> [return: bb18, unwind terminate(cleanup)];
}
bb16 (cleanup): {
drop(_9) -> [return: bb18, unwind terminate(cleanup)];
}
bb17 (cleanup): {
drop(_7) -> [return: bb18, unwind terminate(cleanup)];
}
bb18 (cleanup): {
drop(_5) -> [return: bb19, unwind terminate(cleanup)];
}
bb19 (cleanup): {
drop(_4) -> [return: bb20, unwind terminate(cleanup)];
}
bb20 (cleanup): {
drop(_3) -> [return: bb21, unwind terminate(cleanup)];
}
bb21 (cleanup): {
drop(_2) -> [return: bb22, unwind terminate(cleanup)];
}
bb22 (cleanup): {
drop(_1) -> [return: bb23, unwind terminate(cleanup)];
}
bb23 (cleanup): {
resume;
}
}
@@ -0,0 +1,155 @@
// MIR for `const_array_len` after built
fn const_array_len(_1: [T; 5]) -> () {
debug x => _1;
let mut _0: ();
let _6: ();
let mut _7: T;
let _8: ();
let mut _9: T;
let _10: ();
let mut _11: [T; 2];
let _12: ();
let mut _13: T;
scope 1 {
debug a => _2;
debug b => _3;
debug rest => _4;
debug e => _5;
let _2: T;
let _3: T;
let _4: [T; 2];
let _5: T;
}
bb0: {
PlaceMention(_1);
falseEdge -> [real: bb2, imaginary: bb1];
}
bb1: {
goto -> bb7;
}
bb2: {
StorageLive(_2);
_2 = move _1[0 of 5];
StorageLive(_3);
_3 = move _1[1 of 5];
StorageLive(_4);
_4 = move _1[2..4];
StorageLive(_5);
_5 = move _1[4 of 5];
StorageLive(_6);
StorageLive(_7);
_7 = move _2;
_6 = opaque::<T>(move _7) -> [return: bb3, unwind: bb17];
}
bb3: {
StorageDead(_7);
StorageDead(_6);
StorageLive(_8);
StorageLive(_9);
_9 = move _3;
_8 = opaque::<T>(move _9) -> [return: bb4, unwind: bb16];
}
bb4: {
StorageDead(_9);
StorageDead(_8);
StorageLive(_10);
StorageLive(_11);
_11 = move _4;
_10 = opaque::<[T; 2]>(move _11) -> [return: bb5, unwind: bb15];
}
bb5: {
StorageDead(_11);
StorageDead(_10);
StorageLive(_12);
StorageLive(_13);
_13 = move _5;
_12 = opaque::<T>(move _13) -> [return: bb6, unwind: bb14];
}
bb6: {
StorageDead(_13);
StorageDead(_12);
_0 = const ();
drop(_5) -> [return: bb8, unwind: bb19];
}
bb7: {
_0 = const ();
goto -> bb12;
}
bb8: {
StorageDead(_5);
drop(_4) -> [return: bb9, unwind: bb20];
}
bb9: {
StorageDead(_4);
drop(_3) -> [return: bb10, unwind: bb21];
}
bb10: {
StorageDead(_3);
drop(_2) -> [return: bb11, unwind: bb22];
}
bb11: {
StorageDead(_2);
goto -> bb12;
}
bb12: {
drop(_1) -> [return: bb13, unwind: bb23];
}
bb13: {
return;
}
bb14 (cleanup): {
drop(_13) -> [return: bb18, unwind terminate(cleanup)];
}
bb15 (cleanup): {
drop(_11) -> [return: bb18, unwind terminate(cleanup)];
}
bb16 (cleanup): {
drop(_9) -> [return: bb18, unwind terminate(cleanup)];
}
bb17 (cleanup): {
drop(_7) -> [return: bb18, unwind terminate(cleanup)];
}
bb18 (cleanup): {
drop(_5) -> [return: bb19, unwind terminate(cleanup)];
}
bb19 (cleanup): {
drop(_4) -> [return: bb20, unwind terminate(cleanup)];
}
bb20 (cleanup): {
drop(_3) -> [return: bb21, unwind terminate(cleanup)];
}
bb21 (cleanup): {
drop(_2) -> [return: bb22, unwind terminate(cleanup)];
}
bb22 (cleanup): {
drop(_1) -> [return: bb23, unwind terminate(cleanup)];
}
bb23 (cleanup): {
resume;
}
}
+31
View File
@@ -0,0 +1,31 @@
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
//@ compile-flags: -Zmir-opt-level=0
fn opaque<T>(x: T) {}
// EMIT_MIR array_len.const_array_len.built.after.mir
fn const_array_len<T>(x: [T; 5]) {
// CHECK-LABEL: fn const_array_len(
// CHECK-NOT: Len
// CHECK-NOT: PtrMetadata
// CHECK: = const 5_usize;
if let [a, b, rest @ .., e] = x {
opaque(a);
opaque(b);
opaque(rest);
opaque(e);
}
}
// EMIT_MIR array_len.slice_len.built.after.mir
fn slice_len<T>(x: &[T]) {
// CHECK-LABEL: fn slice_len(
// CHECK-NOT: Len
// CHECK: = PtrMetadata(copy _1);
if let [a, b, rest @ .., e] = x {
opaque(a);
opaque(b);
opaque(rest);
opaque(e);
}
}
@@ -0,0 +1,115 @@
// MIR for `slice_len` after built
fn slice_len(_1: &[T]) -> () {
debug x => _1;
let mut _0: ();
let mut _2: usize;
let mut _3: usize;
let mut _4: usize;
let mut _5: bool;
let _10: ();
let mut _11: &T;
let _12: ();
let mut _13: &T;
let _14: ();
let mut _15: &[T];
let _16: ();
let mut _17: &T;
scope 1 {
debug a => _6;
debug b => _7;
debug rest => _8;
debug e => _9;
let _6: &T;
let _7: &T;
let _8: &[T];
let _9: &T;
}
bb0: {
PlaceMention(_1);
_3 = PtrMetadata(copy _1);
_2 = move _3;
_4 = const 3_usize;
_5 = Ge(move _2, move _4);
switchInt(move _5) -> [0: bb1, otherwise: bb2];
}
bb1: {
goto -> bb9;
}
bb2: {
falseEdge -> [real: bb4, imaginary: bb1];
}
bb3: {
goto -> bb1;
}
bb4: {
StorageLive(_6);
_6 = &(*_1)[0 of 3];
StorageLive(_7);
_7 = &(*_1)[1 of 3];
StorageLive(_8);
_8 = &(*_1)[2:-1];
StorageLive(_9);
_9 = &(*_1)[-1 of 3];
StorageLive(_10);
StorageLive(_11);
_11 = copy _6;
_10 = opaque::<&T>(move _11) -> [return: bb5, unwind: bb11];
}
bb5: {
StorageDead(_11);
StorageDead(_10);
StorageLive(_12);
StorageLive(_13);
_13 = copy _7;
_12 = opaque::<&T>(move _13) -> [return: bb6, unwind: bb11];
}
bb6: {
StorageDead(_13);
StorageDead(_12);
StorageLive(_14);
StorageLive(_15);
_15 = copy _8;
_14 = opaque::<&[T]>(move _15) -> [return: bb7, unwind: bb11];
}
bb7: {
StorageDead(_15);
StorageDead(_14);
StorageLive(_16);
StorageLive(_17);
_17 = copy _9;
_16 = opaque::<&T>(move _17) -> [return: bb8, unwind: bb11];
}
bb8: {
StorageDead(_17);
StorageDead(_16);
_0 = const ();
StorageDead(_9);
StorageDead(_8);
StorageDead(_7);
StorageDead(_6);
goto -> bb10;
}
bb9: {
_0 = const ();
goto -> bb10;
}
bb10: {
return;
}
bb11 (cleanup): {
resume;
}
}
@@ -0,0 +1,115 @@
// MIR for `slice_len` after built
fn slice_len(_1: &[T]) -> () {
debug x => _1;
let mut _0: ();
let mut _2: usize;
let mut _3: usize;
let mut _4: usize;
let mut _5: bool;
let _10: ();
let mut _11: &T;
let _12: ();
let mut _13: &T;
let _14: ();
let mut _15: &[T];
let _16: ();
let mut _17: &T;
scope 1 {
debug a => _6;
debug b => _7;
debug rest => _8;
debug e => _9;
let _6: &T;
let _7: &T;
let _8: &[T];
let _9: &T;
}
bb0: {
PlaceMention(_1);
_3 = PtrMetadata(copy _1);
_2 = move _3;
_4 = const 3_usize;
_5 = Ge(move _2, move _4);
switchInt(move _5) -> [0: bb1, otherwise: bb2];
}
bb1: {
goto -> bb9;
}
bb2: {
falseEdge -> [real: bb4, imaginary: bb1];
}
bb3: {
goto -> bb1;
}
bb4: {
StorageLive(_6);
_6 = &(*_1)[0 of 3];
StorageLive(_7);
_7 = &(*_1)[1 of 3];
StorageLive(_8);
_8 = &(*_1)[2:-1];
StorageLive(_9);
_9 = &(*_1)[-1 of 3];
StorageLive(_10);
StorageLive(_11);
_11 = copy _6;
_10 = opaque::<&T>(move _11) -> [return: bb5, unwind: bb11];
}
bb5: {
StorageDead(_11);
StorageDead(_10);
StorageLive(_12);
StorageLive(_13);
_13 = copy _7;
_12 = opaque::<&T>(move _13) -> [return: bb6, unwind: bb11];
}
bb6: {
StorageDead(_13);
StorageDead(_12);
StorageLive(_14);
StorageLive(_15);
_15 = copy _8;
_14 = opaque::<&[T]>(move _15) -> [return: bb7, unwind: bb11];
}
bb7: {
StorageDead(_15);
StorageDead(_14);
StorageLive(_16);
StorageLive(_17);
_17 = copy _9;
_16 = opaque::<&T>(move _17) -> [return: bb8, unwind: bb11];
}
bb8: {
StorageDead(_17);
StorageDead(_16);
_0 = const ();
StorageDead(_9);
StorageDead(_8);
StorageDead(_7);
StorageDead(_6);
goto -> bb10;
}
bb9: {
_0 = const ();
goto -> bb10;
}
bb10: {
return;
}
bb11 (cleanup): {
resume;
}
}
@@ -0,0 +1,71 @@
- // MIR for `normN` before InstSimplify-after-simplifycfg
+ // MIR for `normN` after InstSimplify-after-simplifycfg
fn normN(_1: [f32; N]) -> f32 {
debug x => _1;
let mut _0: f32;
let _2: f32;
let _3: usize;
let mut _4: bool;
let _6: usize;
let mut _7: bool;
let mut _8: f32;
let mut _9: f32;
let mut _10: f32;
let mut _11: f32;
let mut _12: f32;
let mut _13: f32;
scope 1 {
debug a => _2;
let _5: f32;
scope 2 {
debug b => _5;
}
}
bb0: {
StorageLive(_2);
StorageLive(_3);
_3 = const 0_usize;
_4 = Lt(copy _3, const N);
assert(move _4, "index out of bounds: the length is {} but the index is {}", const N, copy _3) -> [success: bb1, unwind unreachable];
}
bb1: {
_2 = copy _1[_3];
StorageDead(_3);
StorageLive(_5);
StorageLive(_6);
_6 = const 1_usize;
_7 = Lt(copy _6, const N);
assert(move _7, "index out of bounds: the length is {} but the index is {}", const N, copy _6) -> [success: bb2, unwind unreachable];
}
bb2: {
_5 = copy _1[_6];
StorageDead(_6);
StorageLive(_8);
StorageLive(_9);
_9 = copy _2;
StorageLive(_10);
_10 = copy _2;
_8 = Mul(move _9, move _10);
StorageDead(_10);
StorageDead(_9);
StorageLive(_11);
StorageLive(_12);
_12 = copy _5;
StorageLive(_13);
_13 = copy _5;
_11 = Mul(move _12, move _13);
StorageDead(_13);
StorageDead(_12);
_0 = Add(move _8, move _11);
StorageDead(_11);
StorageDead(_8);
StorageDead(_5);
StorageDead(_2);
return;
}
}
@@ -0,0 +1,71 @@
- // MIR for `normN` before InstSimplify-after-simplifycfg
+ // MIR for `normN` after InstSimplify-after-simplifycfg
fn normN(_1: [f32; N]) -> f32 {
debug x => _1;
let mut _0: f32;
let _2: f32;
let _3: usize;
let mut _4: bool;
let _6: usize;
let mut _7: bool;
let mut _8: f32;
let mut _9: f32;
let mut _10: f32;
let mut _11: f32;
let mut _12: f32;
let mut _13: f32;
scope 1 {
debug a => _2;
let _5: f32;
scope 2 {
debug b => _5;
}
}
bb0: {
StorageLive(_2);
StorageLive(_3);
_3 = const 0_usize;
_4 = Lt(copy _3, const N);
assert(move _4, "index out of bounds: the length is {} but the index is {}", const N, copy _3) -> [success: bb1, unwind continue];
}
bb1: {
_2 = copy _1[_3];
StorageDead(_3);
StorageLive(_5);
StorageLive(_6);
_6 = const 1_usize;
_7 = Lt(copy _6, const N);
assert(move _7, "index out of bounds: the length is {} but the index is {}", const N, copy _6) -> [success: bb2, unwind continue];
}
bb2: {
_5 = copy _1[_6];
StorageDead(_6);
StorageLive(_8);
StorageLive(_9);
_9 = copy _2;
StorageLive(_10);
_10 = copy _2;
_8 = Mul(move _9, move _10);
StorageDead(_10);
StorageDead(_9);
StorageLive(_11);
StorageLive(_12);
_12 = copy _5;
StorageLive(_13);
_13 = copy _5;
_11 = Mul(move _12, move _13);
StorageDead(_13);
StorageDead(_12);
_0 = Add(move _8, move _11);
StorageDead(_11);
StorageDead(_8);
StorageDead(_5);
StorageDead(_2);
return;
}
}
@@ -4,7 +4,16 @@
// EMIT_MIR combine_array_len.norm2.InstSimplify-after-simplifycfg.diff
fn norm2(x: [f32; 2]) -> f32 {
// CHECK-LABEL: fn norm2(
// CHECK-NOT: Len(
// CHECK-NOT: PtrMetadata(
let a = x[0];
let b = x[1];
a * a + b * b
}
// EMIT_MIR combine_array_len.normN.InstSimplify-after-simplifycfg.diff
fn normN<const N: usize>(x: [f32; N]) -> f32 {
// CHECK-LABEL: fn normN(
// CHECK-NOT: PtrMetadata(
let a = x[0];
let b = x[1];
a * a + b * b
@@ -12,4 +21,5 @@
fn main() {
assert_eq!(norm2([3.0, 4.0]), 5.0 * 5.0);
assert_eq!(normN([3.0, 4.0]), 5.0 * 5.0);
}