Should ranges::minmax be auto-vectorized instead of manual vectorization. · Issue #4453 · microsoft/STL (original) (raw)

I now see that manually-vectorizing ranges::minmax in #4384 was not necessarily a good idea.
Original implementation was implemented in terms of minmax_element and was not vectorized.
But if it was implemented directly, it would have been vectorized.
Consider the following:

unsigned int* max_element(unsigned intb, unsigned int e){ unsigned int m = b; unsigned int r = b; for (++b; b != e; ++b){ if (m < *b) { m = *b; r = b; } } return b; }

unsigned int max1(unsigned intb, unsigned int e){ return *max_element(b, e); }

unsigned int max2(unsigned int b, unsigned int e){ unsigned int m = *b; for (++b; b != e; ++b){ if (m < *b) { m = *b; } } return m; }

max1 is not vectorized, but max2 is. see https://godbolt.org/z/fG6Yzfz4v

So we could just reimplement ranges::max_element in headers and enjoy vectorization with more context.

Question how should we proceed: