【问题标题】:execution frequency of header of a loop循环头的执行频率
【发布时间】:2011-04-22 19:32:11
【问题描述】:

在 LLVM 通道中,我想记录一个循环的循环行程计数。我所做的一部分是在每个循环的标题块的终止符之前插入一个函数调用。我发现这个方法效果不好,因为如果一个循环有n次迭代,头块会被执行n+1次。这个事实适用于“for”和“while”循环,但不适用于“do while”循环。我将函数调用插入“for”和“while”循环的第二个块,以及“do while”循环的第一个块。仅当我先验地知道目标循环的类型时,这才有效,这通过纯位码是不可能的。我的问题是:是否有一种通用的方式(处理各种循环)来插入函数调用,该函数调用的调用次数与迭代次数完全相同。

【问题讨论】:

    标签: optimization compiler-construction llvm


    【解决方案1】:

    将函数调用放在循环体的开头。你为什么要把它放在标题中?

    for (...) {
      increment_trip_count();
      ...
    }
    

    【讨论】:

    • 如何知道哪个基本块是循环体的开始块?我测试并发现在很多情况下循环头块与循环包含的第一个基本块相同。
    【解决方案2】:

    如果你在循环体的开头插入函数调用,你会得到正确的计数。

    【讨论】:

    • 问题是如何知道循环体的开始块。
    • 循环体是通常放置在大括号内的部分。如果你在那里调用你的函数,它会告诉你身体被执行了多少次,这就是你所要求的,不是吗?
    • 在源码层面,肯定是正确的。但是,我的问题是针对 llvm 的。 llvm 中的循环结构有一个基本块列表。但是,第一个块将被执行 n + 1 次,其中 n 是循环的循环次数。这适用于“for”和“while”循环,但不适用于“do while”循环,其中第一个块将被执行 n 次。
    • 啊,你说的是以 llvm 发出的立即格式插入调用。鉴于此,您可以放心地忽略我的回答,因为我认为这是一个一般性的编程问题。此类特殊情况请说明您的问题,以免日后出现类似误解。
    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 2022-11-22
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    相关资源
    最近更新 更多