Skip to content

WIP: Fix #13002: :set -O does not work in .ghci file

Roland Senn requested to merge RolandSenn/ghc:T13002 into master

When the optimization level is -O0 then the flag Opt_IgnoreInterfacePragmas is True, and GHC ignores optimization data like rewrite rules or inline pragmas from the interface files.

Later when the optmization level of the GHC run changes from -O0 to -O1 or O2 (either in GHCi with a :set command or in GHC with different OPTIONS_GHC pragmas for different modules) then the flag Opt_IgnoreInterfacePragmas is set to False and GHC will process the interface file and store the optimization data from the interface files.

However the optimization data from interface modules processed while the Opt_IgnoreInterfacePragmas was True is missing!

Therefore, when we don't process the optimization data then we add the module to the list eps_ignored_mods. When the flag Opt_IgnoreInterfacePragmas changes, we reprocess the interface files for the modules in eps_ignored_mods and store the optimization data.

In compiler/main/HscTypes.hs there are wrapper functions epsRuleBase and epsPTE to access the fields eps_rule_base and eps_PTE. They return the data according to the Opt_IgnoreInterfacePragmas flag.

A simpler solution would be, just to read and store always ALL the optimization data and just to use the wrapper functions. This was rejected in patch https://phabricator.haskell.org/D2485 due to performance considerations. However, there Simon Marlow suggested the solution now implemented.

Edited by Roland Senn

Merge request reports