Optimization 优化三地址码
我有以下三个地址代码,其中n是某个外部常量: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 如果我 我想尽可能地优化它。以下是我到目前为
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]
那样寻址数组。在我看来,这是一个有趣的优化,但它不是独立于目标的。