
But it does seem hard. The float-out pass assumes, crudely, that it's good to float out a redex of any called-many lambda. But, as we see here,
#14137: Do more inlining into non-recursive join points -------------------------------------+------------------------------------- Reporter: simonpj | Owner: nomeata Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.2.1 Resolution: | Keywords: JoinPoints Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by nomeata): That example is what #10918 is about. The Cardinality Analyser does not see that `ys` is evaluated at most once, but Call Arity does. We can make it inline, but the tricky bit is to prevent it from being floated out again. That’s what I feel that a `call` to a join point outside of `letrec` would be more explicit and more stable – although I see the clumsiness of that. There you write: that's wrong for case branches that are only evaluated on one of those calls (the final one in this case). Not only is that info hard to record in the syntax tree, but it's also potentially quite fragile to program transformation, like other sorts of cardinality information. And a `call` to a join-point outside the `letrec` is so far the only way I can think of to “record it in the syntax tree” – but maybe there are better ways? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14137#comment:16 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler