GCC 不尾调用优化递归函数

GCC doesn't tail call optimize recursive function

我为我的 uint128 结构编写了一个十六进制解析函数,它在内部只有两个 uint64_t - hi 和 lo。这是有问题的功能:

uint128_t parse_from_hex(const char *string, uint128_t previous_value, const size_t num_digits) {
    if (string == NULL || string[0] == '[=10=]')
        return previous_value;

    if (num_digits + 1 > 2 * SIZEOF_INT128) { // SIZEOF_INT128 is 16 - meaning 16 bytes
        return UINT128_MAX; // the maximum value of 128bit uint, if we overflow
    }

    int64_t current_digit = parse_hex_digit(string[0]);
    if (current_digit < 0)
        return UINT128_ZERO; // a global variable which I use multiple times which represents a 0
    return parse_from_hex(string + 1,
                          uint128_or_uint64(uint128_shift_left(previous_value, 4), (uint64_t)current_digit),
                          num_digits + 1);
}

出于某种原因,gcc 没有优化函数,即使在函数末尾显然进行了一次递归调用。解析函数中使用的其他函数没有任何副作用和 return 一个新值,所以我不认为问题出在它们身上。我试过使 uint128_t 结构成员非常量(最初它们是非常量)以及函数参数非常量,但这也没有帮助。最初使用 Ofast 编译,但也尝试使用 O3 和 O2 - 没有运气。任何对这个问题更了解的人都可以帮忙吗?我以为我理解得很好,但显然我遗漏了一些东西。

正如@BillLynch 在评论中指出的那样 - 是 clang 出于某种原因没有优化功能,而不是 GCC。在我的PC上GCC 10.2.0优化了功能,所以这里没有问题。