Evm

LLL 預處理/優化問題

  • December 5, 2017

我在 LLL 中編寫了一個簡單的嵌套宏,但是在使用優化選項呼叫編譯器時,我無法將其簡化為最簡單的表達式。我的宏看起來像這樣:

(def 'mcopy (pos loc length) (codecopy (sub (mul pos 0x2) length) loc length))

閱讀LLL 編譯器文件,似乎使用常量呼叫上述內容應該會生成帶有常量的簡化彙編表達式,例如codecopy(x, b, c),而不是codecopy(sub(mul(a, 0x2), c), b, c)我在反彙編字節碼中看到的那樣。我在其他地方讀到,並非所有優化都能保證發生,但我想知道是否有一種簡單的方法可以解決這個問題,除了在.lll原始碼上編寫我自己的預處理器。

確實,優化器有時在 LLL 程式碼上不如在 Solidity 上有效,但在這種情況下,我從常量表達式折疊中看到了很好的效果:

> lllc --version
LLLC, the Lovely Little Language Compiler
Version: 0.4.20-develop.2017.12.5+commit.4cad0b22.Linux.g++

> cat optimiser_0.lll 
(seq
 (def 'mcopy (pos loc length) (codecopy (sub (mul pos 0x2) length) loc length))
 (mcopy 0x10 0x02 0x03))

> lllc -a optimiser_0.lll 
 codecopy(sub(mul(0x10, 0x2), 0x3), 0x2, 0x3)

> lllc -a -o optimiser_0.lll 
 codecopy(0x1d, 0x2, 0x3)

現在,這是一個盡可能簡單的上下文,而您的上下文將更加複雜。這可能會阻礙優化器。如果您可以提供優化器無法處理的最小範例,我會看看。

引用自:https://ethereum.stackexchange.com/questions/32470