GHC не оптимизирует модули, кроме основного модуля - PullRequest
27 голосов
/ 10 сентября 2011

В настоящее время я пишу многомодульную программу на Haskell.Я обнаружил странную проблему, когда мои файлы не оптимизируются должным образом, хотя я передаю -O2 и так далее.Указанные файлы являются общими модулями 3D векторной математики.При индивидуальной компиляции в .o эти модули оптимизируются правильно.Когда они скомпилированы как часть более крупной программы с использованием --make, они не оптимизированы правильно.Ядро совсем другое.

Я вставил простой урезанный тестовый код в файл vector.hs:

data TestVector = TestVector !Double !Double !Double !Double

addVec :: TestVector -> TestVector -> TestVector

addVec (TestVector x1 y1 z1 w1) (TestVector x2 y2 z2 w2) =
  TestVector (x1 + x2) (y1 + y2) (z1 + z2) (w1 + w2)

И импортировал его из основного ...

import Vector

Этот код компилируется по-разному как отдельный файл .hs, в отличие от того, когда я собираю main.hs, используя --make

Моя командная строка:

ghc -tmpdir tmp -hidir hi -odir obj -fext-core -fexcess-precision -funbox-strict-fields -threaded -rtsopts -fwarn-missing-signatures -Wall -O2 Main.hs -o main

Приветствия

1 Ответ

1 голос
/ 16 октября 2011

Добавить

{-# INLINE addVec #-}

в основном модуле.

GHC необходимо указать эту возможность перед выполнением этой оптимизации, если invokator / invokated находятся в разных модулях.

...