Skip to content

Eta-reduction based on Demand

This is a play on #20040 (closed), although a bit simpler and thus well within reach without #21081 (closed). Consider

f :: (Int -> Int -> Int) -> Int
f c = c 1 2 + c 3 4
{-# NOINLINE f #-}
-- Demand signature of f : <SCS(C1(L))>

g :: (Int -> Int -> Int) -> Int
g c = f (\x y -> c x y)

Today, we get the following Core for g:

g :: (Int -> Int -> Int) -> Int
[GblId, Arity=1, Unf=OtherCon []]
g = \ (c_awQ :: Int -> Int -> Int) ->
      f (\ (x_awR :: Int) (y_awS :: Int) -> c_awQ x_awR y_awS)

E.g., the lambda (\x y -> c x y) is not eta-reduced, although in theory it could be: From f's demand signature <SCS(C1(L))> we know that whenever f evaluates its parameter g, there is also at least one call to g with 2 arguments. Thus, eta-reducing to c is sound, even if evaluating c diverges, simply because the call to f would evaluate c either way.

Edited by Sebastian Graf
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information