@@ -37,6 +37,8 @@ pub struct Baz {
37
37
#[ no_mangle]
38
38
pub fn vec_iterator_cast_primitive ( vec : Vec < i8 > ) -> Vec < u8 > {
39
39
// CHECK-NOT: loop
40
+ // CHECK: call
41
+ // CHECK-SAME: void @llvm.assume(i1 %{{.+}})
40
42
// CHECK-NOT: call
41
43
vec. into_iter ( ) . map ( |e| e as u8 ) . collect ( )
42
44
}
@@ -45,14 +47,35 @@ pub fn vec_iterator_cast_primitive(vec: Vec<i8>) -> Vec<u8> {
45
47
#[ no_mangle]
46
48
pub fn vec_iterator_cast_wrapper ( vec : Vec < u8 > ) -> Vec < Wrapper < u8 > > {
47
49
// CHECK-NOT: loop
50
+ // CHECK: call
51
+ // CHECK-SAME: void @llvm.assume(i1 %{{.+}})
48
52
// CHECK-NOT: call
49
53
vec. into_iter ( ) . map ( |e| Wrapper ( e) ) . collect ( )
50
54
}
51
55
56
+ // CHECK-LABEL: @vec_iterator_cast_signed
57
+ #[ no_mangle]
58
+ pub fn vec_iterator_cast_signed ( vec : Vec < i32 > ) -> Vec < u32 > {
59
+ // CHECK-NOT: and i{{[0-9]+}} %{{.*}}, {{[0-9]+}}
60
+ vec. into_iter ( ) . map ( |e| u32:: from_ne_bytes ( e. to_ne_bytes ( ) ) ) . collect ( )
61
+ }
62
+
63
+ // CHECK-LABEL: @vec_iterator_cast_signed_nested
64
+ #[ no_mangle]
65
+ pub fn vec_iterator_cast_signed_nested ( vec : Vec < Vec < i32 > > ) -> Vec < Vec < u32 > > {
66
+ // CHECK-NOT: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}
67
+ // CHECK-NOT: %{{.*}} = udiv
68
+ vec. into_iter ( )
69
+ . map ( |e| e. into_iter ( ) . map ( |e| u32:: from_ne_bytes ( e. to_ne_bytes ( ) ) ) . collect ( ) )
70
+ . collect ( )
71
+ }
72
+
52
73
// CHECK-LABEL: @vec_iterator_cast_unwrap
53
74
#[ no_mangle]
54
75
pub fn vec_iterator_cast_unwrap ( vec : Vec < Wrapper < u8 > > ) -> Vec < u8 > {
55
76
// CHECK-NOT: loop
77
+ // CHECK: call
78
+ // CHECK-SAME: void @llvm.assume(i1 %{{.+}})
56
79
// CHECK-NOT: call
57
80
vec. into_iter ( ) . map ( |e| e. 0 ) . collect ( )
58
81
}
@@ -61,6 +84,8 @@ pub fn vec_iterator_cast_unwrap(vec: Vec<Wrapper<u8>>) -> Vec<u8> {
61
84
#[ no_mangle]
62
85
pub fn vec_iterator_cast_aggregate ( vec : Vec < [ u64 ; 4 ] > ) -> Vec < Foo > {
63
86
// CHECK-NOT: loop
87
+ // CHECK: call
88
+ // CHECK-SAME: void @llvm.assume(i1 %{{.+}})
64
89
// CHECK-NOT: call
65
90
vec. into_iter ( ) . map ( |e| unsafe { std:: mem:: transmute ( e) } ) . collect ( )
66
91
}
@@ -69,6 +94,8 @@ pub fn vec_iterator_cast_aggregate(vec: Vec<[u64; 4]>) -> Vec<Foo> {
69
94
#[ no_mangle]
70
95
pub fn vec_iterator_cast_deaggregate_tra ( vec : Vec < Bar > ) -> Vec < [ u64 ; 4 ] > {
71
96
// CHECK-NOT: loop
97
+ // CHECK: call
98
+ // CHECK-SAME: void @llvm.assume(i1 %{{.+}})
72
99
// CHECK-NOT: call
73
100
74
101
// Safety: For the purpose of this test we assume that Bar layout matches [u64; 4].
@@ -82,6 +109,8 @@ pub fn vec_iterator_cast_deaggregate_tra(vec: Vec<Bar>) -> Vec<[u64; 4]> {
82
109
#[ no_mangle]
83
110
pub fn vec_iterator_cast_deaggregate_fold ( vec : Vec < Baz > ) -> Vec < [ u64 ; 4 ] > {
84
111
// CHECK-NOT: loop
112
+ // CHECK: call
113
+ // CHECK-SAME: void @llvm.assume(i1 %{{.+}})
85
114
// CHECK-NOT: call
86
115
87
116
// Safety: For the purpose of this test we assume that Bar layout matches [u64; 4].
@@ -95,6 +124,8 @@ pub fn vec_iterator_cast_deaggregate_fold(vec: Vec<Baz>) -> Vec<[u64; 4]> {
95
124
#[ no_mangle]
96
125
pub fn vec_iterator_cast_unwrap_drop ( vec : Vec < Wrapper < String > > ) -> Vec < String > {
97
126
// CHECK-NOT: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}
127
+ // CHECK: call
128
+ // CHECK-SAME: void @llvm.assume(i1 %{{.+}})
98
129
// CHECK-NOT: call
99
130
// CHECK-NOT: %{{.*}} = mul
100
131
// CHECK-NOT: %{{.*}} = udiv
@@ -106,9 +137,12 @@ pub fn vec_iterator_cast_unwrap_drop(vec: Vec<Wrapper<String>>) -> Vec<String> {
106
137
#[ no_mangle]
107
138
pub fn vec_iterator_cast_wrap_drop ( vec : Vec < String > ) -> Vec < Wrapper < String > > {
108
139
// CHECK-NOT: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}
140
+ // CHECK: call
141
+ // CHECK-SAME: void @llvm.assume(i1 %{{.+}})
109
142
// CHECK-NOT: call
110
143
// CHECK-NOT: %{{.*}} = mul
111
144
// CHECK-NOT: %{{.*}} = udiv
145
+ // CHECK: ret void
112
146
113
147
vec. into_iter ( ) . map ( Wrapper ) . collect ( )
114
148
}
0 commit comments