[GHC] #3198: inliner fails to kick in for Double (*)
GHC
trac at galois.com
Tue Apr 28 14:24:43 EDT 2009
#3198: inliner fails to kick in for Double (*)
-----------------------------+----------------------------------------------
Reporter: JulesBean | Owner:
Type: bug | Status: new
Priority: normal | Component: Compiler
Version: 6.11 | Severity: normal
Keywords: | Testcase:
Os: Unknown/Multiple | Architecture: Unknown/Multiple
-----------------------------+----------------------------------------------
In GHC HEAD as of approx March 2009, the following very simple code fails
to inline the (*), which means it fails to generate FPU code:
{{{
module Print where
printTimes :: Double -> Double -> IO ()
printTimes f g = print (f*g)
}}}
My evidence for this is that the generated asm (from -O2 -ddump-asm)
includes
{{{
movl %esi,-4(%ebp)
movl 12(%esi),%eax
movl %eax,-16(%ebp)
movl 8(%esi),%eax
movl %eax,-20(%ebp)
movl $_sC3_info,-12(%ebp)
addl $-20,%ebp
jmp _base_GHCziFloat_timesDouble_info
}}}
...which calls 'GHC.Float.timesDouble' as a regular function with regular
stack calling.
Someone confirmed for me that this also happens for them with the released
GHC 6.10 versions.
On my copy of 6.8.3 the inlining is fine, and I get proper x87 opcodes:
{{{
# gmull %fake0,%fake1,%fake0
#GMUL-xxxcase1
ffree %st(7) ; fld %st(1) ; fmulp %st(0),%st(1)
}}}
Now, if I try a pure version of the code, that is very simply:
{{{
module Times where
f :: Double -> Double -> Double
f x y = x * y
}}}
I don't find it inlines in either HEAD or 6.8. It compiles again to a jump
to _base_GHCziFloat_timesDouble_info.
In all cases (that is, HEAD, 6.8, pure code and print code) simply
replacing {{{x*y}}} with {{{1+x*y}}} solves the problem.
It seems this is some kind of inliner fragility but I'm reporting it as a
bug since it is also a regression from 6.8, in the first form I
discovered.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/3198>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the Glasgow-haskell-bugs
mailing list