src=Hi
ghc1=/opt/exp/ghc/ghc-compare-1/inplace/bin/ghc-stage2
ghc2=/opt/exp/ghc/ghc/inplace/bin/ghc-stage2

HCOPTS="-rtsopts -ddump-to-file -fforce-recomp -dsuppress-coercions -dsuppress-idinfo -ddump-stg -ddump-simpl -dsuppress-uniques -dverbose-core2core -ddump-inlinings"
EXTRA_HCOPTS="-ticky -ticky-allocd -funfolding-use-threshold=200 -O2"
RUN_OPTS="+RTS -s -RTS"

compile() {
    set -x
    (
        mkdir -p 1
        cd 1
        cp ../$src.hs .
        echo "$ghc1 $HCOPTS $EXTRA_HCOPTS $src" > $src.log
        $ghc1 $HCOPTS $EXTRA_HCOPTS $src 2>&1 >> $src.log

        rm -Rf $src.verbose-core2core.split
        split-core2core.py $src.verbose-core2core
    )
    (
        mkdir -p 2
        cd 2
        cp ../$src.hs .
        echo "$ghc2 $HCOPTS $EXTRA_HCOPTS $src" > $src.log
        $ghc2 $HCOPTS $EXTRA_HCOPTS $src 2>&1 >> $src.log

        rm -Rf $src.verbose-core2core.split
        split-core2core.py $src.verbose-core2core
    )
    set +x
}

compare() {
    file=$1
    meld 1/$file 2/$file
}

function _comp_compare() {
    pushd 1 >/dev/null
    COMPREPLY=( $(compgen -o filenames -A file $2))
    popd >/dev/null
}
complete -F _comp_compare compare

run() {
    if [ ! -f run.stdin ]; then touch run.stdin; fi
    (
        cd 1
        ./$src $RUN_OPTS < ../run.stdin >| $src.run 2>&1
    )
    (
        cd 2
        ./$src $RUN_OPTS < ../run.stdin >| $src.run 2>&1
    )
}

echo "GHC 1: $ghc1"
echo "GHC 2: $ghc2"
echo "Module: $src"
echo "GHC options: $HCOPTS $EXTRA_HCOPTS"
echo "Run options: $RUN_OPTS"