Evm
LLL 預處理/優化問題
我在 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)
現在,這是一個盡可能簡單的上下文,而您的上下文將更加複雜。這可能會阻礙優化器。如果您可以提供優化器無法處理的最小範例,我會看看。