Учитывая программу:
import Debug.Trace
main = print $ trace "hit" 1 + trace "hit" 1
Если я компилирую с помощью ghc -O
(7.0.1 или выше), я получаю вывод:
hit
2
то есть GHC использовал устранение общих подвыражений (CSE), чтобы переписать мою программу как:
main = print $ let x = trace "hit" 1 in x + x
Если я компилирую с -fno-cse
, то вижу, что попадание
появляется дважды.
] Можно ли избежать CSE, изменив программу? Есть ли какое-либо подвыражение e
, для которого я могу гарантировать, что e + e
не будет подвергаться CSE? Я знаю о lazy
, но не могу найти ничего, предназначенного для подавления CSE.
Фон этого вопроса - библиотека cmdargs , где CSE нарушает работу библиотеки (из-за примесей в библиотеке). Одно из решений - попросить пользователей библиотеки указать -fno-cse
, но я бы предпочел изменить библиотеку.