Issue 162832
Summary Optimization regression after clang 17
Labels clang
Assignees
Reporter alex-s168
    All clang versions on godbolt after 17.0.1 fail to optimize this lookup table into simple shift instructions

```c
typedef struct {
#define X(a) int x##a : 1;
    X(0) X(1) X(2) X(3)
    X(4) X(5) X(6) X(7)
    X(8) X(9) X(10) X(11)
#undef X
} bits;

int get(bits b, int idx) {
 switch(idx){
#define X(a) case a: return b.x##a; break;
    X(0) X(1) X(2) X(3)
    X(4) X(5) X(6) X(7)
    X(8) X(9) X(10) X(11)
#undef X
 default: __builtin_unreachable();
    }
}
```

with clang 17.0.1 `-target x86_64 -O3`:
```x86asm
get:
        mov     cl, 15
        sub cl, sil
        shl     edi, cl
        movsx   eax, di
        sar eax, 15
        ret
```

but later clang versions don't do this anymore, and instead emit a jump table, with a shift in each case

See: https://godbolt.org/z/c79q7EY4P
(I opened the opt pipeline viewer and noticed that the output of InstCombinerPass is different.
I don't have much knowledge about the internals of llvm tho.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to