Одной из проблем на практике является то, что LLVM была гораздо более подвижной целью.
У GHC возникли проблемы с попыткой поддержки нескольких версий LLVM.
В списке рассылки ghc-dev есть активное обсуждение .
Кстати, в настоящее время бэкенд llvm в ghc находится после того, как Haskell переведен на язык cmm (который, я считаю, в основном просто C - расширен с некоторыми регистрами из языка STG), и из-за вышеизложенного Для устранения трудностей выполняются избыточные оптимизации, которые замедляют компиляцию.
Кроме того, исторически, и в настоящее время AFAIK, проект LLVM не имеет приоритета для предоставления переносной платформы, и некоторые разработчики подчеркивают, что является IR компилятора, а не формой переносимого языка ассемблера .
LLVM IR, который вы пишете для одной целевой цели, может вообще не быть полезной для другой целевой цели. Для сравнения, сайт C-- фактически называет его портативной сборкой. «Вы были бы намного счастливее с одним переносимым языком ассемблера, который мог бы быть…» - цитата из их сайта . На этом веб-сайте также упоминается интерфейс времени выполнения, облегчающий переносимую реализацию сбора мусора и обработки исключений.
Таким образом, вы могли бы думать о C-- как о переносимом общем фундаменте для всех внешних интерфейсов, который имеет немного больше общего с CIL и Java-байт-кодом, а LLVM IR - как о выразительном общем фундаменте для всех ваших бэкэндов, которые облегчает объединение низкоуровневых оптимизаций, общих для нескольких целей. LLVM IR также предоставляет дополнительный бонус, заключающийся в том, что проект LLVM реализует многие из этих низкоуровневых оптимизаций. При этом, в некотором смысле, LLVM IR на самом деле можно считать более высоким уровнем, чем C--, например, LLVM IR имеет разные типы, где, как и в C--, все это просто битовые векторы.