[GHC] #13390: Strict literal float-out during desugaring regresses T1969 at -O0
GHC
ghc-devs at haskell.org
Sat May 13 21:08:45 UTC 2017
#13390: Strict literal float-out during desugaring regresses T1969 at -O0
-------------------------------------+-------------------------------------
Reporter: bgamari | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone: 8.4.1
Component: Compiler | Version: 8.0.1
Resolution: | Keywords:
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 dfeuer):
All right. I took another look at what's going on in HEAD (without the
string literal patch). It looks like I missed one piece: rules. So here's
something more like the real story. We start out with
{{{
$cc_aT4 :: A1 -> String
$cc_aT4
= \ (ds_dUh :: A1) ->
case ds_dUh of { A1 -> GHC.CString.unpackCString# "A1"# }
T1969.$dme :: forall a. C a => a -> String
T1969.$dme
= \ (@ a_aog) ($dC_aSS :: C a_aog) (x_aoi :: a_aog) ->
c @ a_aog $dC_aSS x_aoi
T1969.$dmd :: forall a. C a => a -> String
T1969.$dmd
= \ (@ a_aog) ($dC_aSS :: C a_aog) (x_aoh :: a_aog) ->
c @ a_aog $dC_aSS x_aoh
Rec {
T1969.$fCA1 :: C A1
T1969.$fCA1 = T1969.C:C @ A1 $cc_aT4 $cd_aT8 $ce_aTf
$ce_aTf :: A1 -> String
$ce_aTf = T1969.$dme @ A1 T1969.$fCA1
$cd_aT8 :: A1 -> String
$cd_aT8 = T1969.$dmd @ A1 T1969.$fCA1
end Rec }
}}}
Then `$dme` inlines, producing
{{{
$ce_aTf :: A1 -> String
$ce_aTf = (\ (@ a_aog) ($dC_aSS :: C a_aog) (x_aoi :: a_aog) ->
c @ a_aog $dC_aSS x_aoi) @ A1 T1969.$fCA1
}}}
which reduces to
{{{
$ce_aTf :: A1 -> String
$ce_aTf = \ (x_aoi :: A1) ->
c @ A1 T1969.$fCA1 x_aoi
}}}
Then the class op rule for `c @A1` fires, turning this into
{{{
$ce_aTf :: A1 -> String
$ce_aTf = \ (x_aoi :: A1) -> $cc_aT4 x_aoi
}}}
The same thing happens to `$dmd` and `$cd_aT8`. At some point, I believe
both `ce_aTf` and `cd_aT8` must both get eta-reduced to `$cc_aT4` (which
is perfectly legitimate because `$cc_aT4` is strict in its argument).
`-ddump-inlinings` on its own doesn't show any further inlining, but
`-dverbose-core2core` (if I'm reading it right) shows that the eta-reduced
versions are indeed inlined into the constructor. These are trivial
inlinings, replacing one binding with another, which should get around
your statement that we don't (and don't want to) inline into constructor
arguments.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13390#comment:10>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list