[GHC] #5550: GHC infinite loop when compiling vector
GHC
cvs-ghc at haskell.org
Thu Mar 28 05:51:58 CET 2013
#5550: GHC infinite loop when compiling vector
---------------------------------+------------------------------------------
Reporter: simonpj | Owner:
Type: bug | Status: merge
Priority: low | Milestone: 7.6.2
Component: Compiler | Version: 7.2.1
Keywords: | Os: Unknown/Multiple
Architecture: Unknown/Multiple | Failure: None/Unknown
Difficulty: Unknown | Testcase:
Blockedby: | Blocking:
Related: |
---------------------------------+------------------------------------------
Changes (by amosrobinson):
* status: new => merge
Comment:
I have implemented Roman's suggestion of having an upper bound for
recursive types.
So in this example:
{{{
loop :: SPEC -> [Int] -> [Int] -> [Int]
loop SPEC z [] = z
loop SPEC z (x:xs) = loop SPEC (x:z) xs
}}}
The only good call pattern is
{{{loop SPEC (_:_) _}}}
but once that is specialised, there's another call pattern
{{{loop SPEC (_:(_:_)) _}}}
and so on.
So we just find the maximum number of recursive constructors in the
arguments, and if it's greater than the limit (default 3) we discard the
pattern.
I only check the recursive count if ForceSpecConstr is on for the current
function. This doesn't really matter, but if ForceSpecConstr isn't on it
should terminate anyway because of the max count.
Does this look OK to you, Roman?
https://github.com/ghc/ghc/commit/81d55a9ec28d9d7c8b1492516ebd58c5ff90c0e8
On Fri, Mar 8, 2013 at 7:20 PM, Roman Leshchinskiy <rl at cse.unsw.edu.au>
wrote:
> If you want to prevent infinite specialisation, then IMO the way
> to do it would be by not specialising more than a few times on
> recursive types but still specialising on tuples, Maybe, Either
> and friends as much as possible. That would guarantee termination
> without imposing an artificial bound.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/5550#comment:28>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list