GCC不会尾调用优化递归函数

伦布

我为我的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] == '\0')
        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也不会优化函数。解析函数中使用的其他函数没有任何副作用,并且返回新值,因此我认为问题不在于它们。我曾尝试使uint128_t结构成员为非常量(最初它们为非常量)以及函数参数为非常量,但这也无济于事。最初是使用Ofast编译的,但是也尝试过使用O3和O2-算不上运气。对此主题了解更多的人可以帮忙吗?我以为我很了解,但显然我遗漏了一些东西。

伦布

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章