Skip to content

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

@AlexGuteniev

Description

@AlexGuteniev

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

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