// compile-flags: -O -Z merge-functions=disabled // only-x86_64 // ignore-debug #![crate_type = "lib"] // CHECK-LABEL: @vec_zero_bytes #[no_mangle] pub fn vec_zero_bytes(n: usize) -> Vec { // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc( // CHECK-NOT: call {{.*}}llvm.memset // CHECK: call {{.*}}__rust_alloc_zeroed( // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc( // CHECK-NOT: call {{.*}}llvm.memset // CHECK: ret void vec![0; n] } // CHECK-LABEL: @vec_one_bytes #[no_mangle] pub fn vec_one_bytes(n: usize) -> Vec { // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( // CHECK: call {{.*}}__rust_alloc( // CHECK: call {{.*}}llvm.memset // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( // CHECK: ret void vec![1; n] } // CHECK-LABEL: @vec_zero_scalar #[no_mangle] pub fn vec_zero_scalar(n: usize) -> Vec { // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc( // CHECK: call {{.*}}__rust_alloc_zeroed( // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc( // CHECK: ret void vec![0; n] } // CHECK-LABEL: @vec_one_scalar #[no_mangle] pub fn vec_one_scalar(n: usize) -> Vec { // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( // CHECK: call {{.*}}__rust_alloc( // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( // CHECK: ret void vec![1; n] } // CHECK-LABEL: @vec_zero_rgb48 #[no_mangle] pub fn vec_zero_rgb48(n: usize) -> Vec<[u16; 3]> { // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc( // CHECK: call {{.*}}__rust_alloc_zeroed( // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc( // CHECK: ret void vec![[0, 0, 0]; n] } // CHECK-LABEL: @vec_zero_array_16 #[no_mangle] pub fn vec_zero_array_16(n: usize) -> Vec<[i64; 16]> { // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc( // CHECK: call {{.*}}__rust_alloc_zeroed( // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc( // CHECK: ret void vec![[0_i64; 16]; n] } // CHECK-LABEL: @vec_zero_tuple #[no_mangle] pub fn vec_zero_tuple(n: usize) -> Vec<(i16, u8, char)> { // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc( // CHECK: call {{.*}}__rust_alloc_zeroed( // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc( // CHECK: ret void vec![(0, 0, '\0'); n] } // CHECK-LABEL: @vec_non_zero_tuple #[no_mangle] pub fn vec_non_zero_tuple(n: usize) -> Vec<(i16, u8, char)> { // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( // CHECK: call {{.*}}__rust_alloc( // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( // CHECK: ret void vec![(0, 0, 'A'); n] } // CHECK-LABEL: @vec_option_bool #[no_mangle] pub fn vec_option_bool(n: usize) -> Vec> { // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc( // CHECK: call {{.*}}__rust_alloc_zeroed( // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc( // CHECK: ret void vec![Some(false); n] } // CHECK-LABEL: @vec_option_i32 #[no_mangle] pub fn vec_option_i32(n: usize) -> Vec> { // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc( // CHECK: call {{.*}}__rust_alloc_zeroed( // CHECK-NOT: call {{.*}}alloc::vec::from_elem // CHECK-NOT: call {{.*}}reserve // CHECK-NOT: call {{.*}}__rust_alloc( // CHECK: ret void vec![None; n] } // Ensure that __rust_alloc_zeroed gets the right attributes for LLVM to optimize it away. // CHECK: declare noalias noundef ptr @__rust_alloc_zeroed(i64 noundef, i64 allocalign noundef) unnamed_addr [[RUST_ALLOC_ZEROED_ATTRS:#[0-9]+]] // CHECK-DAG: attributes [[RUST_ALLOC_ZEROED_ATTRS]] = { {{.*}} allockind("alloc,zeroed,aligned") allocsize(0) uwtable "alloc-family"="__rust_alloc" {{.*}} }