0

我有以下三個地址碼,其中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 
    t1 = -4 
L: t1 = t1+4 
    t5 = a[t1] * b[t1] 
    x = x + t5 
    i = i + 1 
    if i < n goto L 

任何人都可以提供更正/額外的優化?

+1

目標體系結構是否支持複雜的內存尋址,並且是能夠識別簡單模式以映射到該目標的代碼組? – harold

+1

這裏沒有真正的目標架構。這更多的是我正在努力學習編譯器代碼優化的教學示例。 –

+0

好的。太糟糕了。否則,我會建議使用負索引來計算數組末尾的偏移量(然後'i harold

回答

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(從而節省了比較)。

+1

t1 =(n-1)* 4是無效的三地址碼。另外,我不確定這是如何相等的。根據原來的T1最初必須是0--不能保證n-1將是0. –

+0

如果'n'恆定(你說它在問題中),爲什麼它不是有效的3AC?表達式的值可以在編譯時進行評估。至於它如何相當;代碼(根據我的理解)計算'a'和'b'之間的乘積之和。總結的順序應該沒有關係(它不會影響結果),所以我的答案從n-1向後循環到0,因爲這通常更有效。 – Michael

+0

+1。根據維基百科有關TAC的文章:「包含多個基本操作的表達式不能用三地址代碼表示爲單個指令。」所以我認爲需要將其分解爲t1 = n-1和t1 = t1 * 4。除此之外,我認爲你的表述實際上是相同的,所以我收回了對此的懷疑。然而,我仍然不相信這是最優化的 - 儘管你少了一條指令,但你已經引入了一個額外的MUL操作。你可能是對的,但我不確定。 –