| @@ -41,8 +41,9 @@ where |
|
|
| 41 |
41 |
|
| 42 |
42 |
let result = self.iter.try_for_each(|element |
| 43 |
43 |
let idx = initialized; |
|
44 |
+// branchless index update combined with unconditionally copying the value even when |
|
45 |
+// it is filtered reduces branching and dependencies in the loop. |
| 44 |
46 |
initialized = idx + (self.predicate)(&element) as usize; |
| 45 |
|
- |
| 46 |
47 |
// SAFETY: Loop conditions ensure the index is in bounds. |
| 47 |
48 |
unsafe { array.get_unchecked_mut(idx) }.write(element); |
| 48 |
49 |
|
| @@ -99,6 +100,7 @@ where |
|
|
| 99 |
100 |
fn next_chunk<const N: usize>( |
| 100 |
101 |
&mut self, |
| 101 |
102 |
) -> Result<[Self::Item; N], array::IntoIter<Self::Item, N>> { |
|
103 |
+// avoid codegen for the dead branch |
| 102 |
104 |
let fun = const { |
| 103 |
105 |
if crate::mem::needs_drop::<I::Item>() { |
| 104 |
106 |
array::iter_next_chunk::<I::Item, N> |