[GHC] #7411: Exceptions are optimized away in certain situations
GHC
ghc-devs at haskell.org
Mon May 7 07:16:24 UTC 2018
#7411: Exceptions are optimized away in certain situations
-------------------------------------+-------------------------------------
Reporter: SimonHengel | Owner: (none)
Type: bug | Status: new
Priority: high | Milestone: 8.6.1
Component: Compiler | Version: 7.6.1
Resolution: | Keywords: seq, deepseq,
| evaluate, exceptions
Operating System: Linux | Architecture: x86_64
| (amd64)
Type of failure: Incorrect result | Test Case:
at runtime | simplCore/should_fail/T7411
Blocked By: | Blocking:
Related Tickets: #5129 | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by tdammers):
The relevant Core for the unoptimized run:
{{{
main
= evaluate
(deepseq
($fNFData[] $fNFDataChar)
(: (C# 'a'#)
(undefined
((pushCallStack
(unpackCString# "undefined"#,
SrcLoc
(unpackCString# "main"#)
(unpackCString# "Main"#)
(unpackCString# "example.hs"#)
(I# 4#)
(I# 25#)
(I# 4#)
(I# 34#))
emptyCallStack)
`cast` <Co:4>)))
(return $fMonadIO ()))
}}}
As expected, `deepseq` is retained. However, in the optimized version, we
get this:
{{{
Rec {
main_go
main_go
= \ ds_a2Nc ->
case ds_a2Nc of {
[] -> ();
: x_a2Ng xs_a2Nh ->
case x_a2Ng of { C# ipv_s2Np -> main_go xs_a2Nh }
}
end Rec }
main2
main2 = undefined (lvl10_r4dT `cast` <Co:4>)
lvl11_r4dU
lvl11_r4dU = C# 'a'#
lvl12_r4dV
lvl12_r4dV = : lvl11_r4dU main2
lvl13_r4dW
lvl13_r4dW
= \ eta_B1 -> case main_go lvl12_r4dV of { () -> (# eta_B1, () #) }
main1
main1 = \ s_a2Nw -> (# s_a2Nw, lvl13_r4dW `cast` <Co:3> #)
}}}
(boilerplate stripped for clarity)
Which, IIUC, does not respect the spirit of `deepseq` - specifically, the
list construction in `lvl12_r4dV` isn't strict, so the `undefined` that
`main2` produces isn't being forced.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/7411#comment:18>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list