Skip to content

DataCon wrappers get in the way of rules

This is a spin-off of #12618##12689:

Simon writes there:

Actually this is already a problem today. It's just rendered more prominent now that even (:) has a wrapper. Consider

data T = MkT {-# UNPACK #-} !Int

{-# RULES

"fT" f MkT = True
"gT" forall x. g (MkT x) = x
  #-}

f :: (Int -> T) -> Bool
{-# NOINLINE f #-}
f x = True

g :: T -> Int
{-# NOINLINE g #-}
g (MkT x) = x+1

yields

Foo.hs:9:1: warning: [-Winline-rule-shadowing]
    Rule "fT" may never fire because 'Foo.$WMkT' might inline first
    Probable fix: add an INLINE[n] or NOINLINE[n] pragma for 'Foo.$WMkT'

Foo.hs:10:1: warning: [-Winline-rule-shadowing]
    Rule "gT" may never fire because 'Foo.$WMkT' might inline first
    Probable fix: add an INLINE[n] or NOINLINE[n] pragma for 'Foo.$WMkT'

What to do? If we are to match these rules, we really must delay inlining the wrapper for MkT (after inlining we get a mess of unboxing etc). So either we must allow you to add a NOINLINE pragma to MkT; or we must add one automatically (e.g. NOINLINE [1]).

Delaying all consructor-wrapper inlining to phase 1 is potentially quite drastic, because case-of-known-constructor wouldn't happen until the wrappers are inlined. Maybe that's ok; I'm not sure. Worth trying I think.

Trac metadata
Trac field Value
Version 8.0.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information