Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to dump GHC simplifier output in human-readable form?

I have the following program:

data Peano = Zero | Succ Peano deriving (Show)

add Zero     b = b
add (Succ a) b = add a (Succ b)

mul Zero     b = Zero
mul (Succ a) b = add b (mul a b)

four x = let two = Succ (Succ Zero) in mul two two

I want to get something like this from GHC:

add =
  \ ds b ->
    case ds of
      Zero ->
        b
      Succ a ->
        add
          a
          (Succ b)

mul =
  \ ds b ->
    case ds of 
      Zero ->
        Zero
      Succ a ->
        add
          b
          (mul a b)

four =
    let
      two =
        Succ
           (Succ Zero)
    in
    mul two two

The best I managed to get is

ghci -ddump-simpl -dsuppress-module-prefixes -dsuppress-uniques foo.hs

but it steel required a lot of manual removal of GHC generated stuff to get the code above. Is there a switch for GHC or a third party script that does the cleanup?

Is there a way at least to get rid of case {tick (main:Main, 8)} @ (State# RealWorld) of _ { __DEFAULT ->?

like image 723
nponeccop Avatar asked May 21 '12 22:05

nponeccop


1 Answers

You're in luck! There is a tool for the job: ghc-core.

ghc-core wraps ghc with a command line wrapper that displays GHC's optimised core and assembly output in a human readable, colourised manner, in a pager.

Usage - just replace ghc with ghc-core:

   ghc-core A.hs  

   ghc-core -fvia-C -optc-O3 A.hs
like image 53
Don Stewart Avatar answered Oct 02 '22 14:10

Don Stewart