Skip to content

[missed optimization] Missed removing loop of setting zero when dereference pointer (memset) #139810

Open
@BreadTom

Description

@BreadTom

Godbolt and GCC Bug

void f0(unsigned char *ptr, unsigned long len){
    for(unsigned long i = 0; i < len; ++i){
        ptr[i] = 0;
    }
}

void f1(unsigned char *ptr, unsigned long len){
    for(unsigned long i = 0; i < len; ++i){
        while(ptr[i])
            ptr[i]--;
    }
}

void f2(unsigned char *ptr){
    while(ptr[0])
        ptr[0]--;
}

When flags are -O3,
f1() compares if ptr[i] is zero before setting it to zero and f0() memset it to zero.

When flags are -O3 and -march=icelake-client, f1() doesn't call memset like f0().

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions