https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109931

            Bug ID: 109931
           Summary: Knowledge on literal not used in optimization
           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: antoshkka at gmail dot com
  Target Milestone: ---

Function for comparing a lower-cased string with runtime string of known size:


constexpr bool ICaseEqualLowercase(const char* lowercase, const char* y,
                                   unsigned size) noexcept {
    constexpr char kLowerToUpperMask = static_cast<char>(~unsigned{32});
    for (unsigned i = 0; i < size; ++i) {
        const auto lowercase_c = lowercase[i];
        if (lowercase_c != y[i]) {
            if (!('a' <= lowercase_c && lowercase_c <= 'z') ||
                (lowercase_c & kLowerToUpperMask) != y[i]) {
                return false;
            }
        }
    }

    return true;
}
bool test2(const char* y) {
    return ICaseEqualLowercase("hello", y, 5);
}


With GCC trunk and -O2 flags the GCC fails to understand that all the
characters of `lowercase` are lowercase ASCII and the expression `!('a' <=
lowercase_c && lowercase_c <= 'z')` is always `false`.

Because of that, additional instructions in loop are emitted:
        lea     esi, [rdx-97]
        cmp     sil, 25
        ja      .L6


Godbolt playground: https://godbolt.org/z/xrc1T4oeW

Reply via email to