https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113632
Bug ID: 113632
Summary: Range info for a^CST could be improved
Product: gcc
Version: 14.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: pinskia at gcc dot gnu.org
Target Milestone: ---
Take:
```
void dummy();
_Bool f(unsigned long a)
{
_Bool cmp = a > 8192;
if (cmp) goto then; else goto e;
then:
unsigned long t = __builtin_clzl(a); // [0,50]
t^=63; // [13,63]
return t >= 13;
e:
dummy();
return 0;
}
```
Currently after the t^=63; we get:
```
# RANGE [irange] int [1, 63] MASK 0x3f VALUE 0x0
_7 = _1 ^ 63;
```
But this could/should be improved to [13,63].
If we change to using minus instead:
```
t = 63 - t;
```
We get the better range and the comparison (t >= 13) is optimized away.
```
Folding statement: t_10 = 63 - t_9;
Global Exported: t_10 = [irange] long unsigned int [13, 63] MASK 0x3f VALUE 0x0
Not folded
```
Yes this should up in real code, see the LLVM issue for more information on
that.