[GHC] #13429: Optimizer produces Core with an infinite <<loop>>
GHC
ghc-devs at haskell.org
Mon May 1 18:35:47 UTC 2017
#13429: Optimizer produces Core with an infinite <<loop>>
-------------------------------------+-------------------------------------
Reporter: lehins | Owner: (none)
Type: bug | Status: new
Priority: high | Milestone: 7.10.4
Component: Compiler | Version: 8.0.2
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: Runtime crash | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by dfeuer):
I've reduced it once more. I believe the fundamental problem here happens
in specialization. We get
{{{
Rec {
-- RHS size: {terms: 2, types: 1, coercions: 0, joins: 0/0}
$dArray_s1RC :: Array X Word8
[LclId]
$dArray_s1RC = Loop.$fArrayXe @ Word8 GHC.Word.$fNumWord8
-- RHS size: {terms: 2, types: 1, coercions: 0, joins: 0/0}
$dArray1_s1RG [Occ=OnceL] :: Array X Word8
[LclId]
$dArray1_s1RG = Loop.$fArrayXe @ Word8 $dNum_s1RH
-- RHS size: {terms: 2, types: 2, coercions: 0, joins: 0/0}
$dNum_s1RH :: Num Word8
[LclId]
$dNum_s1RH = Loop.$p1Array @ X @ Word8 $dArray_s1RC
-- RHS size: {terms: 7, types: 5, coercions: 0, joins: 0/0}
$s$fArrayXe_s1RS [InlPrag=CONLIKE] :: Array X Word8
[LclId,
Unf=DFun: \ ->
Loop.C:Array TYPE: X
TYPE: Word8
Loop.$fArrayXe_$cp1Array @ Word8 $dNum_s1RH
Loop.$fArrayXe_$cpromote @ Word8 $dNum_s1RH
Loop.$fArrayXe_$cmakeImage @ Word8 $dNum_s1RH]
$s$fArrayXe_s1RS =
Loop.C:Array
@ X
@ Word8
(Loop.$fArrayXe_$cp1Array @ Word8 $dNum_s1RH)
(Loop.$fArrayXe_$cpromote @ Word8 $dNum_s1RH)
(Loop.$fArrayXe_$cmakeImage @ Word8 $dNum_s1RH)
...
}}}
which doesn't seem ''inherently'' bad (although it's not very clean), but
then we also get this rather awful specialization rule:
{{{
"SPEC/Main $fArrayXe @ Word8"
forall (v_s1RJ :: Num Word8).
Loop.$fArrayXe @ Word8 v_s1RJ
= $s$fArrayXe_s1RS
}}}
If this rule fires in the RHS of `$dArray_s1RC`, then we get
{{{
$dArray_s1RC = $s$fArrayXe_s1RS
}}}
Inlining that into `$dNum_s1RH` gives
{{{
$dNum_s1RH = Loop.$p1Array @ X @ Word8 $s$fArrayXe_s1RS
}}}
But `$dNum_s1RH` is used in the definition of `$s$fArrayXe_s1RS`, so we
have a loop. I don't know if I've told exactly the right story here, but I
think the real story is probably pretty similar. The results will be
excruciatingly fragile, depending on whether the right or wrong
specialization rule fires.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13429#comment:14>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list