Как я могу помочь SpecConstr в GHC?

Я использую GHC 7.4.1, чтобы попытаться скомпилировать программу, использующую Repa. Но частично через компиляцию у меня заканчивается память. С ghc -v я вижу, что он застревает в фазе SpecConstr.

SpecConstr является одним из преобразований ядра с ядрами GHC. Simon Peyton Jones имеет приятное описание здесь, и там есть код здесь, но это довольно медленно для меня, так как я не очень хорошо знаком с внутренней работой GHC.

Я хотел бы как-то помочь компилятору - есть ли способ сказать, где он застревает? Альтернативно, существует ли способ ограничить использование памяти в этой фазе, пока я не смогу перекомпилировать более крупную машину?

Спасибо, Чад

Ответ 1

Вы можете попробовать скомпилировать флаги -fspec-constr-threshold=n и -fspec-constr-count=n. Более подробная информация содержится в документах GHC. В 7.4.1 значения по умолчанию: n = 200 для порога и n = 3 для счетчика.

Без просмотра кода, возможно, вы столкнулись с этой ошибкой. В этом случае вам может потребоваться полностью отключить пропуск specconstr, если указанные выше параметры недостаточны.

Ответ 2

В дополнение к ответу John L убедитесь, что вы скомпилируете флаг -fno-liberate-case. Преобразование случая освобождения имеет тенденцию вызывать кодовое раздутие, что делает работу SpecConstr более сложной.