Optimization 优化三地址码

Optimization 优化三地址码,optimization,assembly,compiler-construction,compiler-optimization,machine-code,Optimization,Assembly,Compiler Construction,Compiler Optimization,Machine Code,我有以下三个地址代码,其中n是某个外部常量: x = 0 i = 0 L: t1 = i * 4 t2 = a[t1] t3 = i * 4 t4 = b[t3] t5 = t2 * t4 x = x + t5 i = i + 1 if i < n goto L x=0 i=0 L:t1=i*4 t2=a[t1] t3=i*4 t4=b[t3] t5=t2*t4 x=x+t5 i=i+1 如果我 我想尽可能地优化它。以下是我到目前为

我有以下三个地址代码,其中n是某个外部常量:

   x = 0
   i = 0
L: t1 = i * 4
   t2 = a[t1]
   t3 = i * 4
   t4 = b[t3]
   t5 = t2 * t4
   x = x + t5
   i = i + 1
   if i < n goto L
x=0
i=0
L:t1=i*4
t2=a[t1]
t3=i*4
t4=b[t3]
t5=t2*t4
x=x+t5
i=i+1
如果我
我想尽可能地优化它。以下是我到目前为止得出的结论:

    x = 0
    i = 0
    t1 = -4
L:  t1 = t1+4
    t5 = a[t1] * b[t1]
    x = x + t5
    i = i + 1
    if i < n goto L
x=0
i=0
t1=-4
L:t1=t1+4
t5=a[t1]*b[t1]
x=x+t5
i=i+1
如果我

有人能提供更正/其他优化吗?

我可能会这样做:

    x = 0
    t1 = (n-1)*4
L:  t5 = a[t1] * b[t1]
    x = x + t5
    t1 = t1 - 4
    if t1 >= 0 goto L

我不知道目标机器是什么,但最后两条指令通常可以使用
SUB
/
JNS
(保存比较)。

t1=(n-1)*4不是有效的三地址代码。而且,我不确定这是如何等价的。根据原始数据,T1最初必须为0-不能保证n-1为0。如果
n
为常数(您已说明这是一个问题),为什么3AC无效?表达式的值可以在编译时计算。至于它是如何等价的;代码(根据我的理解)计算
a
b
之间的乘积之和。求和的顺序应该无关紧要(它不会影响结果),因此我的答案从n-1向后循环到0,因为这通常更有效。+1对您来说。根据维基百科关于TAC的文章:“包含多个基本运算的表达式不能在三个地址代码中表示为一条指令。”因此我认为需要将其分为t1=n-1和t1=t1*4。除此之外,我认为你的陈述实际上是等价的,所以我收回我对此的怀疑。然而,我仍然不相信这是更优化的——尽管您少了一条指令,但您已经引入了一个额外的MUL操作。但是你可能是对的,我只是不确定。额外的mul不在循环中,如果你没有目标体系结构,最优性是如何定义的?最少的指令?执行最少的指令?有些指令比其他指令重吗?也许我在前面的评论中有点不清楚:因为
n
是常量,所以可以在编译时计算
(n-1)*4
,例如,如果
n
为5,则3AC指令可能为
t1=16
。目标体系结构是否支持复杂的内存寻址,并且codegen是否能够识别简单的模式以映射到该模式?这里没有真正的目标体系结构。这更像是一个教学示例,我正在学习编译器代码优化。Ok。太糟糕了。否则,我会建议使用负索引计算数组末尾的偏移量(然后
I
测试变成
I==0
,这将被合并到加法中),并像
end[4*I]
那样寻址数组。在我看来,这是一个有趣的优化,但它不是独立于目标的。