<div dir="auto">Ben Gamari and Reid Barton are interested in making it cheaper for static data to pass through simplification. The basic idea is that if a term is already made entirely of data constructors and literals, then there's nothing left to optimize.<div dir="auto"><br></div><div dir="auto">However, RULES are allowed to match on data constructors and it would be nice to let that keep happening. But on the other hand, RULES are apparently (according to Duncan Coutts) already broken for strict data constructors, because they have workers and wrappers.</div><div dir="auto"><br></div><div dir="auto">My thought: let's allow phased INLINE and NOINLINE pragmas for data constructors. The default would be INLINE. The ~ phase choice would not be available: once inline, always inline.</div><div dir="auto"><br></div><div dir="auto">Semantics</div><div dir="auto">~~~~~~~~~~</div><div dir="auto"><br></div><div dir="auto">For all constructors:</div><div dir="auto"><br></div><div dir="auto">If a constructor is allowed by pragmas to inline in a certain phase, then in that phase terms built from it can be considered static. Once static, always static.</div><div dir="auto"><br></div><div dir="auto">If a constructor is not allowed to inline in a certain phase, terms built from it will be considered non-static.</div><div dir="auto"><br></div><div dir="auto">After demand analysis and worker/wrapper, all constructors are considered inline.</div><div dir="auto"><br></div><div dir="auto">For strict constructors:</div><div dir="auto"><br></div><div dir="auto">A strict constructor wrapper prohibited from inlining in a certain phase simply will not.</div><div dir="auto"><br></div><div dir="auto">Strict constructor wrappers will all be allowed to inline after demand analysis and worker/wrapper. This matches the way we now handle wrappers actually created in that phase.</div><div dir="auto"><br></div><div dir="auto">Syntax:</div><div dir="auto"><br></div><div dir="auto">For GADT syntax, this is easy:</div><div dir="auto"><br></div><div dir="auto">data Foo ... where</div><div dir="auto">  {-# INLINE [1] Bar #-}</div><div dir="auto">  Bar :: ...</div><div dir="auto"><br></div><div dir="auto">For traditional syntax, I think it's probably best to pull the pragmas to the top:</div><div dir="auto"><br></div><div dir="auto">{-# NOINLINE Quux #-}</div><div dir="auto">data Baz ... = Quux ... | ...</div></div>