[Bug tree-optimization/114326] New: Missed optimization for A || B when !B implies A.
manolis.tsamis at vrull dot eu
gcc-bugzilla@gcc.gnu.org
Wed Mar 13 14:19:19 GMT 2024
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114326
Bug ID: 114326
Summary: Missed optimization for A || B when !B implies A.
Product: gcc
Version: 14.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: manolis.tsamis at vrull dot eu
Target Milestone: ---
The function below doesn't fold to return 0;
int cmp1(uint64_t d1, uint64_t d2) {
if (((d1 ^ d2) & 0xabcd) == 0 || d1 != d2)
return 0;
return foo();
}
while the following function does:
int cmp2(uint64_t d1, uint64_t d2) {
if (d1 != d2 || ((d1 ^ d2) & 0xabcd) == 0)
return 0;
return foo();
}
The functions are equivalent since the lhs and rhs of || don't have side
effects.
In general, there pattern here is a side-effect free expression a || b where !b
implies a should be optimized to true. As in the testcase above, a doesn't
necessarily imply !b. Something similar could be stated for && expressions.
Complementary godbolt link: https://godbolt.org/z/qK5bYf36T
More information about the Gcc-bugs
mailing list