Issue |
160378
|
Summary |
`switch` lowering generates lookup tables with unnecessarily large elements
|
Labels |
missed-optimization
|
Assignees |
|
Reporter |
Kmeakin
|
Instead of generating a LUT with 64-bit elements, LLVM should generate a LUT with 8-bit elements and then zero-extend. This doesn't change the number of instructions required to do the lookup, but does reduce binary size
https://godbolt.org/z/1Mhcoz6bh
```c++
#include <cstdint>
// clang-format off
enum Month {
January, February, March,
April, May, June,
July, August, September,
October, November, December,
};
auto src(Month month) -> std::size_t {
switch (month) {
case January: return 31;
case February: return 31;
case March: return 31;
case April: return 30;
case May: return 31;
case June: return 30;
case July: return 31;
case August: return 31;
case September: return 30;
case October: return 31;
case November: return 30;
case December: return 31;
default: __builtin_unreachable();
}
}
auto tgt(Month month) -> std::size_t {
static const std::uint8_t LUT[12] = {
31, 31, 31, 30,
31, 30, 31, 31,
30, 31, 30, 31,
};
return LUT[month];
}
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs