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

Reply via email to