需要哪些编译器优化来优化此递归调用?

问题描述 投票:0回答:0

这里有两个版本的简单算术表达式求值器(游乐场链接:https://play.rust-lang.org/?version=nightly&mode=release&edition=2021&gist=d3da06b0077b29e0e3ac85720c567dd8) 第二个版本使用递归调用来重用一些代码(显然不值得在这个玩具示例中付出努力,但这就是它是一个玩具示例的原因)。 我相信足够聪明的编译器可以意识到对

eval_slow(Sum(...))
的递归调用本身不会进行任何递归调用,因此内联是安全的,并且
eval_slow
实际上应该编译为与
eval_fast
相同的程序集。实际上,rustc 目前不执行此优化,并且
eval_slow
包含递归调用(请参阅游乐场链接中的程序集输出)。

是否有能够执行此类优化(对于任何语言)的优化编译器?编译器文献中有这种类型的优化的名称吗?这是否可能在不久的将来得到正确优化,或者(的一般版本)这是一个非常难解决的问题?

pub enum Expr {
    Lit(isize),
    Sum(isize, isize),
    Sub(isize, isize),
}

pub enum Expr {
    Lit(isize),
    Sum(isize, isize),
    Sub(isize, isize),
}

// simple and fast
pub fn eval_fast(expr: Expr) -> isize {
    use Expr::*;
    match expr {
        Lit(x) => x,
        Sum(x, y) => x + y,
        Sub(x, y) => x - y
    }
}

// we'd like to inline the recursive call to `eval_slow(Sum(...))`, but it doesn't happen. 
pub fn eval_slow(expr: Expr) -> isize {
    use Expr::*;
    match expr {
        Lit(x) => x,
        Sum(x, y) => x + y,
        Sub(x, y) => eval_slow(Sum(x, -y))
    }
}

注意:也将其标记为 C++,因为我的问题不是特定于 rust 的,尽管我的示例是(而且据我所知,这种优化很可能无论如何都会存在于与语言无关的 LLVM 通道中)

c++ rust compiler-optimization
© www.soinside.com 2019 - 2024. All rights reserved.