[GHC] #6122: INLINE pragma not obeyed
GHC
cvs-ghc at haskell.org
Mon Aug 13 15:02:22 CEST 2012
#6122: INLINE pragma not obeyed
-------------------------------+--------------------------------------------
Reporter: augustss | Owner:
Type: bug | Status: closed
Priority: normal | Milestone:
Component: Compiler | Version: 7.4.1
Resolution: wontfix | Keywords:
Os: Unknown/Multiple | Architecture: Unknown/Multiple
Failure: None/Unknown | Difficulty: Unknown
Testcase: | Blockedby:
Blocking: | Related:
-------------------------------+--------------------------------------------
Comment(by simonpj):
The other difficulty is that you are are asking MUCH MORE than simply
"obey INLINE". If you meant that, then you'd get:
{{{
count 0 (floatRadix 1 ^ floatDigits 1)
==> let v = floatRadix 1 ^ floatDigits 1
in if v < 10 then 0 else count (0+1) (v `quot` 10)
==> let v = floatRadix 1 ^ floatDigits 1
v' = v `quot` 10
in if v < 10 then n else
if v' < 10 then 0+1 else count (0+1+1) (v' `quot` 10)
...etc firever...
}}}
Now you are expecting that the optimiser will statically evaluate
`(floatRadix 1 ^ floatDigits 1)`, and `(v < 10)`, etc, AND will do so
before infinitely unfolding `count`. This is jolly delicate IMHO.
I suppose one might try something like "only inline if not under a
conditional", but even that is tricky in a lazy language where a
conditional is just another function. Maybe only inline in the strict-
evaluation path?
Anyway it seems pretty tricky to me. But I just wanted to be clear that
simply honouring an INLINE is likely to be extremely fragile, which is why
we don't do it.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/6122#comment:5>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the Glasgow-haskell-bugs
mailing list