Commit 03bf7b49 by simonpj@microsoft.com

Document the CONLIKE pragma

`Do not merge to 6.12`
parent 5da093e7
 ... ... @@ -7541,6 +7541,14 @@ itself, so an INLINE pragma is always ignored. portable). CONLIKE modifier CONLIKE An INLINE or NOINLINE pragma may have a CONLIKE modifier, which affects matching in RULEs (only). See . Phase control ... ... @@ -8176,18 +8184,24 @@ not be substituted, and the rule would not fire. How rules interact with INLINE/NOINLINE and CONLIKE pragmas Ordinary inlining happens at the same time as rule rewriting, which may lead to unexpected results. Consider this (artificial) example f x = x {-# RULES "f" f True = False #-} g y = f y h z = g True {-# RULES "f" f True = False #-} Since f's right-hand side is small, it is inlined into g, to give ... ... @@ -8201,14 +8215,37 @@ would have been a better chance that f's RULE might fire. The way to get predictable behaviour is to use a NOINLINE pragma on f, to ensure pragma, or an INLINE[phase] pragma, on f, to ensure that it is not inlined until its RULEs have had a chance to fire. GHC is very cautious about duplicating work. For example, consider f k z xs = let xs = build g in ...(foldr k z xs)...sum xs... {-# RULES "foldr/build" forall k z g. foldr k z (build g) = g k z #-} Since xs is used twice, GHC does not fire the foldr/build rule. Rightly so, because it might take a lot of work to compute xs, which would be duplicated if the rule fired. Sometimes, however, this approach is over-cautious, and we do want the rule to fire, even though doing so would duplicate redex. There is no way that GHC can work out when this is a good idea, so we provide the CONLIKE pragma to declare it, thus: {-# INLINE[1] CONLIKE f #-} f x = blah CONLIKE is a modifier to an INLINE or NOINLINE pragam. It specifies that an application of f to one argument (in general, the number of arguments to the left of the '=' sign) should be considered cheap enough to duplicate, if such a duplication would make rule fire. (The name "CONLIKE" is short for "constructor-like", because constructors certainly have such a property.) The CONLIKE pragam is a modifier to INLINE/NOINLINE because it really only makes sense to match f on the LHS of a rule if you are sure that f is not going to be inlined before the rule has a chance to fire. ... ... @@ -8480,15 +8517,22 @@ comparison. Use to see what transformation rules GHC is using. Use to see what rules are being fired. If you add you get a more detailed listing. Use to see in great detail what rules are being fired. If you add you get a still more detailed listing. The definition of (say) build in GHC/Base.lhs looks like this: ... ...
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment