[Haskell-cafe] Imported rewrite rules are ignored

Alexander Vieth aovieth at gmail.com
Mon Dec 21 16:23:51 UTC 2015

Hi café,

I observe that rewrite rules from imported modules are ignored by GHC.
Given these two files, one module and one executable, the problem can be
demonstrated by switching between `rewrite_me` and `rewrite_me_local`. If
the rule fires, the program should run cleanly, as the `error` term should
be rewritten to `()`. The imported function rewrite_me is not rewritten;
but the same thing, rewrite_me_local, defined in the same program, will be

File RuleModule.hs

    module RuleModule where

    {-# NOINLINE rewrite_me #-}
    rewrite_me :: () -> ()
    rewrite_me = error "Should rewrite"

    {-# RULES
    "rewrite_me" forall input .
             rewrite_me input = ()

File Rule.hs

    import RuleModule

    {-# NOINLINE rewrite_me_local #-}
    rewrite_me_local :: () -> ()
    rewrite_me_local = error "Should rewrite"

    {-# RULES
    "rewrite_local" forall input .
                    rewrite_me_local input = ()

    -- Replace with rewrite_me_local and it's all good.
    main = case rewrite_me () of
        () -> return ()

This is GHC 7.10.2. I compile using -O -fenable-rewrite-rules.

Using -dverbose-core2core, the "Desugar (after optimization)" section shows
no rules when using rewrite_me, but shows the rule rewrite_local when using
the local variant. Maybe this is expected, but I thought it important to

Thanks for any advice,

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20151221/158f78ea/attachment.html>

More information about the Haskell-Cafe mailing list