由于数组是非标量值,因此我难以理解计算数组活动度的概念。所有有关活跃度的书籍和课程都始终仅使用标量值,但非标量似乎需要以不同的方式计算其活跃度,例如,当数组元素通过赋值定义时,不一定意味着整个数组在此之前不再有效就像处理标量值一样为了进一步使事情复杂化,您只能以高级中间代码访问数组的定义和使用,当我们转到较低级别时,此信息会部分消失。有人知道怎么做吗?
编辑:我的最终目标是为堆叠框架的图形着色生成干涉图,以使其尺寸最小化,因此我将需要精确的活动信息或活动范围。这个问题实际上是一个两部分的问题。首先,我们如何计算高级中间代码中非标量值的活跃度,其次,我们如何将该解决方案转换为低级别中间代码版本。
编辑: 这是C语言中问题的一个示例,尽管它在AST或高级中间代码中非常相似。
void testFunction() {
int n;
int i[100]; // array is declared here
// array is dead before this point
i[10] = n; // array elements are used/defined here, the array is live
n = i[11]; // array elements are used/defined here, array is still live
// other code here
i[12] = n; // array elements are used/defined here, array is still live
i[13] = n; // array elements are used/defined here again but for the
// last time, after this the array is not live
}
在低级中间代码中,这些数组访问可分解为许多指令,而在优化之后,我们可能会丢失关于 当使用和定义数组元素时,因为指令可能会有些混乱,因此变得一团糟。
n = i[10]
变成类似
t0 = 10 // the element of the array we are indexing into
t1 = t0 * size // the size of each element of the array
t2 = &i // the base address of the array named "i"
t3 = t1 + t2
n = *t3
编辑:我想我可以将元数据添加到低级解引用指令中,以获取如下所示的低级中间代码上非标量的定义和使用。
t0 = &i // this would not count as a use since it is only the
// address of the array i
n = *t0 // use of i
*t0 = n // definition of i
仅留下提取非标量的活动性/活动范围的问题。 标量活跃度是作为向后的数据流问题计算的,当看到变量的使用时,该变量将变为活跃状态,而当我们遇到该变量的定义时,该变量将死亡。 对于非标量活泼,它的寿命似乎需要从一开始就延长 定义或使用直到在每个流上遇到最后一个定义为止 路径。我正在考虑先计算一个非标量的到达定义,然后使用它来计算def-use和use-def链,然后将所有 使用定义链一起组成一个有效范围。我认为这将为任何非标量提供适当的有效范围,只要它的初始定义不是在函数之外完成的?在那种情况下,它将一直有效直到函数入口。因此,这不适用于全球人士,但无论如何他们都将被视为永远活着,不需要计算其生命力。我有什么想念的吗?有人能想到一种更好的方法吗?
答案 0 :(得分:1)
活动性分析始终是一个保守的估计。永远不会使用“实时”变量。 (它的未来使用可能是有条件的,即使是基于其值可能已经确定的条件也是如此。)重要的是,只能保证不需要非实时变量。分析越精确,将提出越多的优化可能性,但存在一个折衷:与可能的附加值相比,更精确的分析可能过于昂贵。
鉴于此,值得一问的是,知道数组的一部分不存在时可以产生什么值。例如,仅在非常特殊的情况下才可以回收阵列的一部分。
因此,将数组视为单个实体是一种合理的方法。在这种近似中,如果数组中的任何元素存在,则该数组是活动的。仅在不需要数组中的元素的情况下,才将数组从活动集中删除。显然,这是一个保守的近似值。如所示,它可能会提供尽可能多的有用信息。
了解特定数组元素的值可能很有用,但是即使在那里,通常也知道能够知道整个数组不会发生变异,而不是尝试跟踪单个元素的可变性,这通常就足够了。一旦知道数组是不可变的,就有可能在已知索引处推断元素的值,从而允许涉及查找表的表达式的恒定折叠。某些编译器肯定会这样做,但是在复杂性和增值之间又要权衡取舍,如果很难或不可能执行完全精确的分析,则不需要绝对精度。