if [ $# -lt 1 ]
then
    echo Syntax: comp file.c
    exit 1
else
    join="true"
    keep="false"
    if [ $# -eq 2 ]
    then
        if [ $2 == "-j" ]
        then
            join="true"
        elif [ $2 == "-k" ]
        then
            keep="true"
        fi
    fi
    if [ $# -eq 3 ]
    then
        if [ $3 == "-j" ]
        then
            join="true"
        elif [ $3 == "-k" ]
        then
            keep="true"
        fi
    fi
    file_name=$1
    exec_name="EXECUTABLE"
    base_name=$(basename $1 .c)
    btcd_name="$base_name.bc"
    ch_name="$base_name.ch"
    s_ch_name="$base_name.ch.s"
    ch_out="$base_name.ch.out"
    ln_name="$base_name.ln"
    ln_out="$base_name.ln.out"
    s_ln_name="$base_name.ln.s"
    gcc_name="$base_name.gcc"
    gcc_out="$base_name.gcc.out"
    llvm-gcc $file_name -o $base_name
#    llc -f -regalloc=chordal -stats -time-passes $btcd_name -o $s_ch_name
#    llc -f -regalloc=linearscan -SSA-based=true -join-liveintervals=true exec.bc -o exec.s # -stats -time-passes
#    llc -f -disable-spill-fusing -regalloc=graphcoloring exec.bc -o exec.s -stats
#    llc -f -regalloc=pbqp $btcd_name -o $s_ch_name -stats -time-passes
#    llc -f -regalloc=local -disable-spill-fusing $btcd_name -o $s_ch_name -stats -time-passes
    llc -f -join-liveintervals=true -regalloc=graphcoloring -disable-spill-fusing $btcd_name -o $s_ch_name # -stats -time-passes
#    llc -f -regalloc=linearscan -SSA-based=true -join-liveintervals=$join $btcd_name -o $s_ch_name #  -stats -time-passes
    llc -f -disable-spill-fusing -regalloc=linearscan -SSA-based=false -join-liveintervals=true $btcd_name -o $s_ln_name # -stats -time-passes
    echo ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  Ch time:"
    gcc $s_ch_name -o $exec_name
    time ./$exec_name > $ch_out
#    gcc $s_ch_name -o $ch_name
#    time ./$ch_name > $ch_out
    echo ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  Ln time:"
    gcc $s_ln_name -o $exec_name
    time ./$exec_name > $ln_out
#    gcc $s_ln_name -o $ln_name
#    time ./$ln_name > $ln_out
    echo ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GCC time:"
    gcc $file_name -o $exec_name
    time ./$exec_name > $gcc_out
#    gcc $file_name -o $gcc_name
#    time ./$gcc_name > $gcc_out
    echo ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  wc output:"
    wc -l $s_ch_name
    wc -l $s_ln_name
    echo ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  diff output:"
    ls -la $ch_out $ln_out $gcc_out
    echo ""
    diff -qs $ch_out $ln_out
    diff -qs $ch_out $gcc_out
    diff -qs $ln_out $gcc_out
    echo ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .stats:"
    stats_sh $s_ch_name $s_ln_name
    echo ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  End:"
    rm -f $exec_name
    rm -f $base_name
    rm -f $gcc_name
    rm -f $ch_name
    rm -f $ln_name
    if [ $keep == "true" ]
    then
        echo "Keeping $s_ch_name and $s_ln_name"
    else
        rm -f $s_ch_name
        rm -f $s_ln_name
    fi
    rm -f $btcd_name
    rm -f $ch_out
    rm -f $ln_out
    rm -f $gcc_out
fi
