https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114009
Bug ID: 114009
Summary: Missed optimization: (!a) * a => 0 when a=(a/2)*2
Product: gcc
Version: 14.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: 652023330028 at smail dot nju.edu.cn
Target Milestone: ---
Hello, we noticed that the code below can be optimized as stated in the title
((!a) * a => 0), but gcc -O3 missed it.
Different from PR 113716, this example can be optimized under the option of gcc
-O3 -fwrapv. At the same time, their patterns are different.
https://godbolt.org/z/GrPY1d6o3
int w;
void func(int a) {
a = (a/2)*2;
w = (!a) * a;
}
GCC -O3 :
func(int):
mov eax, edi
xor edx, edx
shr eax, 31
add eax, edi
add edi, 1
sar eax
cmp edi, 2
cmova eax, edx
add eax, eax
mov DWORD PTR w[rip], eax
ret
Expected code (GCC -O3 -fwrapv):
func(int):
mov DWORD PTR w[rip], 0
ret
Thank you very much for your time and effort! We look forward to hearing from
you.