[Bug tree-optimization/86604] New: Compiler can't think of smaller variable ranges
mcccs at gmx dot com
gcc-bugzilla@gcc.gnu.org
Fri Jul 20 08:01:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86604
Bug ID: 86604
Summary: Compiler can't think of smaller variable ranges
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: mcccs at gmx dot com
Target Milestone: ---
Summary: The compiler thinks variables as of the widest domain.
(32 bits for int, 64 bits for int64_t) It's possible to optimize
further by giving the compiler a hint about the domain. It can
be used to eliminate most of the branches.
For clarity, I'm going to define __builtin_guarantee first.
#define __builtin_guarantee(a) \
if (!(a)) { \
__builtin_unreachable(); \
}
The optimization: We can tell the compiler about the range
of a parameter, and it'll be able to use this knowledge
to eliminate most of the branches.
void CreateChecksum(int isTestNet, int *t) {
if (isTestNet == 0)
*t += 1;
}
Output with `-Ofast -march=native`:
CreateChecksum:
test edi, edi
jne .L3
inc DWORD PTR [rsi]
.L3:
ret
But if we could do that:
void CreateChecksum(int isTestNet, int *t) {
__builtin_guarantee(isTestNet == 0 || isTestNet == 1);
if (isTestNet == 0)
*t += 1;
}
It'd see that
*t += isTestNet ^ 1
But for some reason, Compiler doesn't limit the number of
possibilities of variables according to builtin unreachable.
More information about the Gcc-bugs
mailing list