llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
27.05k stars 11.08k forks source link

DSE fails to remove/fold stores #49418

Open davidbolvansky opened 3 years ago

davidbolvansky commented 3 years ago
Bugzilla Link 50074
Version trunk
OS Windows NT
CC @alinas,@DMG862,@fhahn,@nikic

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

davidbolvansky commented 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.