
#11126: Entered absent arg in a Repa program -------------------------------------+------------------------------------- Reporter: tuplanolla | Owner: Type: bug | Status: new Priority: highest | Milestone: 8.0.1 Component: Compiler | Version: 7.10.2 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Incorrect result | Unknown/Multiple at runtime | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj):
So the main question would be: Does the compiler consider unfoldings when determining whether a value is unused and thus can be replaced by `absentError`?
I'm very impressed. You've waded though the swamp and indeed I think you have nailed a culprit. Whether it is ''the'' culprit in the original program I don't know, but this does look wrong. Just to lay it out, we have {{{ f x = let arr2 = ... let getIt :: Int -> Int [Unf = { Src=InlineStable, Tmpl=..arr2... }] getIt n = ...(no arr2)... in ... }}} So `arr2` is not used in `getIt`'s RHS (presumably because `arr2` has already been inlined into it, but it ''is'' used in `getIt`'s ''unfolding''. Moreover, it's a "stable" unfolding, meaning that it stays unaffected by transformations in `getIt`'s RHS. So the following sequence could happen * Strictness analysis thinks that `arr2` is unused * Worker-wrapper replaces its binding with `arr2 = absentError "blah"` * `getIt` is inlined at some call site, and lo! `arr2` is resurrected. Hmm. Now you have exposed this so well, it's clear that the demand analyser should take account of the free vars of the unfolding, at least so far as absence analysis is concerned. I'll look at how to do that. Most helpful. Please apply your forensic powers to other bugs :-). -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11126#comment:7 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler