Skip to content

Should ranges::minmax be auto-vectorized instead of manual vectorization. #4453

Description

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 int*b, 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 int*b, 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:

  • Keep manual vectorization forever
  • Drop it in vNext
  • Drop it any time

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementSomething can be improvedwontfixThis will not be worked on

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions