Как предотвратить общее устранение подвыражений (CSE) с GHC

Учитывая программу:

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 , но я бы предпочел изменить библиотеку.

25
задан Don Stewart 7 May 2011 в 17:10
поделиться