Open davidbolvansky opened 3 years ago
Another testcase
void dse_fold4(unsigned char p, unsigned char q, bool b, int i) { p[i] = 0; q[i+1] = 0; p[i]++; }
So basically when alias analysis checks pointer and if we store same value, we can threat them as "noalias" like.
Extended Description
void dse_fold(unsigned char p, unsigned char q, int i){ p[i]=0; q[i]=0; // ... p[i]++; }
void dse_fold2(unsigned char p, unsigned char q, int i){ p[i]=0; q[i]=0; // ... p[i] = 1; }
void dse_fold3(unsigned char p, unsigned char q, int i){ p[i]=0; q[i]=0; // ... p[i] += 100; }
LLVM -O3: dse_fold(unsigned char, unsigned char, int): # @dse_fold(unsigned char, unsigned char, int) movsxd rax, edx mov byte ptr [rdi + rax], 0 mov byte ptr [rsi + rax], 0 add byte ptr [rdi + rax], 1 ret dse_fold2(unsigned char, unsigned char, int): # @dse_fold2(unsigned char, unsigned char, int) movsxd rax, edx mov byte ptr [rsi + rax], 0 mov byte ptr [rdi + rax], 1 ret dse_fold3(unsigned char, unsigned char, int): # @dse_fold3(unsigned char, unsigned char, int) movsxd rax, edx mov byte ptr [rdi + rax], 0 mov byte ptr [rsi + rax], 0 add byte ptr [rdi + rax], 100 ret
GCC -O3: dse_fold(unsigned char, unsigned char, int): movsx rdx, edx mov BYTE PTR [rsi+rdx], 0 mov BYTE PTR [rdi+rdx], 1 ret dse_fold2(unsigned char, unsigned char, int): movsx rdx, edx mov BYTE PTR [rsi+rdx], 0 mov BYTE PTR [rdi+rdx], 1 ret dse_fold3(unsigned char, unsigned char, int): movsx rdx, edx mov BYTE PTR [rsi+rdx], 0 mov BYTE PTR [rdi+rdx], 100 ret
https://godbolt.org/z/7bbrs6P5M