Fix Trac #4870: get the inlining for an imported INLINABLE Id
authorsimonpj@microsoft.com <unknown>
Wed, 5 Jan 2011 00:27:12 +0000 (00:27 +0000)
committersimonpj@microsoft.com <unknown>
Wed, 5 Jan 2011 00:27:12 +0000 (00:27 +0000)
We need the unfolding even for a *recursive* function (indeed
that's the point) and I was using the wrong function to get it
(idUnfolding rather than realIdUnfolding).

compiler/deSugar/DsBinds.lhs

index 57c7482..815c0d1 100644 (file)
@@ -526,13 +526,14 @@ dsSpec mb_poly_rhs (L loc (SpecPrag poly_id spec_co spec_inl))
   where
     is_local_id = isJust mb_poly_rhs
     poly_rhs | Just rhs <-  mb_poly_rhs
-             = rhs
-             | Just unfolding <- maybeUnfoldingTemplate (idUnfolding poly_id)
-             = unfolding
+             = rhs         -- Local Id; this is its rhs
+             | Just unfolding <- maybeUnfoldingTemplate (realIdUnfolding poly_id)
+             = unfolding    -- Imported Id; this is its unfolding
+                           -- Use realIdUnfolding so we get the unfolding 
+                           -- even when it is a loop breaker. 
+                           -- We want to specialise recursive functions!
              | otherwise = pprPanic "dsImpSpecs" (ppr poly_id)
-       -- In the Nothing case the specialisation is for an imported Id
-       -- whose unfolding gives the RHS to be specialised
-        -- The type checker has checked that it has an unfolding
+                           -- The type checker has checked that it *has* an unfolding
 
 specUnfolding :: (CoreExpr -> CoreExpr) -> Type 
               -> Unfolding -> DsM (Unfolding, OrdList (Id,CoreExpr))