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().