【问题标题】:How do I get the number of variables alive in a for loop?如何在 for 循环中获得活动变量的数量?
【发布时间】:2018-06-09 16:34:53
【问题描述】:

考虑以下代码:

int main() {
    int a = 0;
    int b = 1;

    for (int i = 0; i < 3; i++) {
        a = 2;
        int c = 1;
        int d = 3;
        d = a + c;
    }

   a = b+2;
}

在上面的代码中,三个变量的生命周期包含在循环体中(icd)。我希望能够使用 LLVM 计算其寿命存在于任何给定循环主体中的变量(即对于这个循环,我的代码应该返回 3)。

我找到了Live Variables Analysis,但我无法使用它来查找我上面描述的内容。

【问题讨论】:

  • 请注意,编译器可能会将您的代码优化为int main(){}。所以分析编译后的代码可能会产生一些惊喜。
  • @Bathsheba 没关系,我只想确定优化后的 IR 中的任何变量。我不太关心原始的 C++ 代码。
  • 这是一个有趣的问题(我赞成),但如果我需要分析编译器做了什么,我会检查程序集。也许我错过了你的问题的重点?
  • @Bathsheba 我有大量的 for 循环,我需要从中自动提取各种特征。不幸的是,由于循环的数量,自己手动检查是不可行的。这是一个更大的研究项目的一部分。
  • 我不是 llvm 专家,但是查看 generated AST 应该很容易枚举所有属于 ForStmt 子级的 VarDecl ...(嗯,这取决于您的确切意思“实时变量”,但你明白了)

标签: c++ c llvm


【解决方案1】:

也许这应该只是一个注释,但我无法表达内联代码:

只有两个变量在循环体内有持续时间。 i 在循环开始之前声明,并持续到最后一次执行循环体之后。换句话说,c 和 d 被构造/破坏了 3 次;在第三次被破坏后,则 i 是。

因此,您编写的 for 循环相当于:

{
    int i = 0;
    while (i < 3)
    {
        a = 2;
        int c = 1;
        int d = 3;
        d = a + c;

    }
    i++;
}

额外的大括号集合调用块作用域; i 超出范围并在 for 循环体之外被销毁,但在任何后续代码之前。

【讨论】:

    猜你喜欢
    • 2022-09-25
    • 1970-01-01
    • 2020-02-21
    • 2017-03-22
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 2018-08-24
    相关资源
    最近更新 更多