https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117352
Bug ID: 117352
Summary: switch bit test conversion makes comparison code worse
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: ak at gcc dot gnu.org
Target Milestone: ---
With the change in PR117091 that makes switch bit test conversion more
aggressive
I see a failure in gcc.dg/pr21643.c which checks for tree reassoc happening.
I fixed the the test by using -fno-bit-tests.
However this makes the generated code on aarch64 worse:
int
f1 (unsigned char c)
{
if (c == 0x22 || c == 0x20 || c < 0x20)
return 1;
return 0;
}
Before (with -fno-bit-tests or without PR117091 change)
f1:
.LFB0:
and w0, w0, 255
mov w1, 32
cmp w0, 34
ccmp w0, w1, 0, ne
cset w0, ls
ret
After:
f1:
.LFB0:
and w0, w0, 255
mov x1, -281449206906881
movk x1, 0x0, lsl 48
cmp w0, 35
lsr x0, x1, x0
and w0, w0, 1
csel w0, w0, wzr, cc
ret
So I guess tree-reassoc needs to learn to handle bit test switch code better?