<?xml version="1.0"?>
<acovea_config>
    <acovea version="5.1" />
    <description value="ghc 6.10 / gcc 4.3 Core 2 Duo (x86_64)" version="1.2.0" />
    <get_version value="ghc --numeric-version" />
    <quoted_options value="false" />

<!-- full set of GHC and GCC flags to try. Make sure you leave enough time -->

    <!-- we start with -O2, and then try extra things -->
    <prime command="ghc"
           flags="--make -fforce-recomp -O2 -funbox-strict-fields -fvia-C -optc-march=core2 ACOVEA_OPTIONS -o ACOVEA_OUTPUT ACOVEA_INPUT" />

   <!-- baselines -->
    <baseline description="-optc-O3"
              command="ghc"
              flags="--make -fforce-recomp -O2 -funbox-strict-fields -fvia-C -optc-O3 -optc-march=core2 -o ACOVEA_OUTPUT ACOVEA_INPUT" />

    <baseline description="-optc-O"
              command="ghc"
              flags="--make -fforce-recomp -O2 -funbox-strict-fields -fvia-C -optc-O -optc-march=core2 -o ACOVEA_OUTPUT ACOVEA_INPUT" />

    <baseline description="-fasm"
              command="ghc"
              flags="--make -fforce-recomp -O2 -funbox-strict-fields -fasm -o ACOVEA_OUTPUT ACOVEA_INPUT" />

    <!-- A list of flags that will be "evolved" by ACOVEA -->
    <flags>

        <!-- GHC options -->
        <flag type="simple" value="-fcase-merge" />
        <flag type="simple" value="-fdicts-strict" />
        <flag type="simple" value="-fdicts-cheap" />
        <flag type="simple" value="-fdo-eta-reduction" />
        <flag type="simple" value="-fdo-lambda-eta-expansion" />
        <flag type="simple" value="-fexcess-precision" />
        <flag type="simple" value="-fmax-worker-args=100" />
        <flag type="simple" value="-fsimplifier-phases=10" />
        <flag type="simple" value="-fmax-simplifier-iterations=10" />
        <flag type="simple" value="-fno-state-hack" />
        <flag type="simple" value="-fcse" />
        <flag type="simple" value="-ffull-laziness" />
        <flag type="simple" value="-fenable-rewrite-rules" />
        <flag type="simple" value="-fstrictness" />
        <flag type="simple" value="-fspec-constr" />
        <flag type="simple" value="-fspec-constr-threshold=1000" />
        <flag type="simple" value="-fspec-constr-count=8" />
        <flag type="simple" value="-fliberate-case" />
        <flag type="simple" value="-fstatic-argument-transformation" />
        <flag type="simple" value="-fliberate-case-threshold=1000" />
        <flag type="simple" value="-funbox-strict-fields" />
        <flag type="simple" value="-funfolding-creation-threshold=1000" />
        <flag type="simple" value="-funfolding-fun-discount=1000" />
        <flag type="simple" value="-funfolding-keeness-factor=1000" />
        <flag type="simple" value="-funfolding-use-threshold=1000" />

        <flag type="simple" value="-fno-pre-inlining" />
        <flag type="simple" value="-fno-method-sharing" />

        <!-- GCC options -->

        <!-- O1 options (these turn off options implied by -O1) -->
        <flag type="simple" value="-optc-fno-merge-constants" />
        <flag type="simple" value="-optc-fno-defer-pop" />
        <flag type="simple" value="-optc-fno-thread-jumps" />
        <flag type="simple" value="-optc-fno-guess-branch-probability" />
        <flag type="simple" value="-optc-fno-cprop-registers" />
        <flag type="simple" value="-optc-fno-if-conversion" />
        <flag type="simple" value="-optc-fno-if-conversion2" />
        <flag type="simple" value="-optc-fno-delayed-branch" />
        <flag type="simple" value="-optc-ftree-ccp" />
        <flag type="simple" value="-optc-ftree-dce" />
        <flag type="simple" value="-optc-ftree-dominator-opts" />
        <flag type="simple" value="-optc-ftree-dse" />
        <flag type="simple" value="-optc-ftree-ter" />
        <flag type="simple" value="-optc-ftree-lrs" />
        <flag type="simple" value="-optc-ftree-sra" />
        <flag type="simple" value="-optc-ftree-copyrename" />
        <flag type="simple" value="-optc-ftree-fre" />
        <flag type="simple" value="-optc-ftree-ch" />
        <flag type="simple" value="-optc-fmerge-constants" />

        <!--
           -fauto-inc-dec
           -fdce -fdse
           -finline-small-functions
           -fipa-pure-const
           -fipa-reference
           -fsplit-wide-types
           -funit-at-a-time
        -->

        <!-- O2 options -->
        <flag type="simple" value="-optc-fcrossjumping" />
        <flag type="simple" value="-optc-foptimize-sibling-calls" />
        <flag type="simple" value="-optc-fcse-follow-jumps" />
        <flag type="simple" value="-optc-fcse-skip-blocks" />
        <flag type="simple" value="-optc-fgcse" />
        <flag type="simple" value="-optc-fexpensive-optimizations" />
        <flag type="simple" value="-optc-fstrength-reduce" />
        <flag type="simple" value="-optc-frerun-cse-after-loop" />
        <flag type="simple" value="-optc-frerun-loop-opt" />
        <flag type="simple" value="-optc-fcaller-saves" />
        <flag type="simple" value="-optc-fpeephole2" />
        <flag type="simple" value="-optc-fschedule-insns" />
        <flag type="simple" value="-optc-fschedule-insns2" />
        <flag type="simple" value="-optc-fregmove" />
        <flag type="simple" value="-optc-fstrict-aliasing" />
        <flag type="simple" value="-optc-fstrict-overflow" />
        <flag type="simple" value="-optc-fdelete-null-pointer-checks" />
        <flag type="simple" value="-optc-freorder-blocks" />
        <flag type="simple" value="-optc-fthread-jumps" />
        <flag type="simple" value="-optc-fgcse-lm" />
        <flag type="simple" value="-optc-fsched-interblock" />
        <flag type="simple" value="-optc-fsched-spec" />
        <flag type="simple" value="-optc-freorder-blocks" />
        <flag type="simple" value="-optc-freorder-functions" />
        <flag type="simple" value="-optc-funit-at-a-time" />
        <flag type="simple" value="-optc-falign-functions" />
        <flag type="simple" value="-optc-falign-jumps" />
        <flag type="simple" value="-optc-falign-loops" />
        <flag type="simple" value="-optc-falign-labels" />
        <flag type="simple" value="-optc-ftree-pre" />
        <flag type="simple" value="-optc-ftree-vrp" />

        <!-- O3 options -->
        <flag type="simple" value="-optc-finline-functions" />
        <flag type="simple" value="-optc-funswitch-loops" />
        <flag type="simple" value="-optc-fgcse-after-reload" />
        <flag type="simple" value="-optc-fpredictive-commoning" />
        <flag type="simple" value="-optc-ftree-vectorize" />
           
        <!-- Additional options -->
        <flag type="enum"   value="-optc-fomit-frame-pointer|-optc-momit-leaf-frame-pointer" />
        <flag type="simple" value="-optc-ffloat-store" />
        <flag type="simple" value="-optc-fprefetch-loop-arrays" />
        <flag type="simple" value="-optc-fno-inline" />
        <flag type="simple" value="-optc-fpeel-loops" />
        <flag type="simple" value="-optc-ftracer" />
        <flag type="simple" value="-optc-funswitch-loops" />
        <flag type="simple" value="-optc-fsplit-ivs-in-unroller" />
        <flag type="enum"   value="-optc-funroll-loops|-optc-funroll-all-loops" />
        <flag type="enum"   value="-optc-fbranch-target-load-optimize|-optc-fbranch-target-load-optimize2" />
        <flag type="simple" value="-optc-fmodulo-sched" />
        <flag type="simple" value="-optc-fno-function-cse" />
        <flag type="simple" value="-optc-fgcse-sm" />
        <flag type="simple" value="-optc-fgcse-las" />
        <flag type="simple" value="-optc-freschedule-modulo-scheduled-loops" />
        <flag type="simple" value="-optc-ftree-loop-im" />
        <flag type="simple" value="-optc-ftree-loop-ivcanon" />
        <flag type="simple" value="-optc-fivopts" />
        <flag type="simple" value="-optc-fvariable-expansion-in-unroller" />

        <!-- Options specific to Intel-style architecture -->
        <flag type="simple" value="-optc-mieee-fp" />
        <flag type="simple" value="-optc-mno-push-args" />
        <flag type="simple" value="-optc-maccumulate-outgoing-args" />
        <flag type="simple" value="-optc-mno-align-stringops" />
        <flag type="simple" value="-optc-minline-all-stringops" />
        <flag type="enum"   value="-optc-mfpmath=387|-optc-mfpmath=sse|-optc-mfpmath=sse,387" />
        <flag type="simple" value="-D__NO_MATH_INLINES" />

        <!-- Options specific to "fast math" -->
        <flag type="simple" value="-optc-fno-math-errno" />
        <flag type="simple" value="-optc-funsafe-math-optimizations" />
        <flag type="simple" value="-optc-fno-trapping-math" />
        <flag type="simple" value="-optc-ffinite-math-only" />
        <flag type="simple" value="-optc-fno-signaling-nans" />
        <flag type="simple" value="-optc-fcx-limited-range" />

        <!-- Tuning options that have a numeric value -->
        <flag type="tuning" value="-optc-finline-limit" default="600" min="100" max="10000" step="100" separator="=" />

        <!-- todo ghc options -->

    </flags>

</acovea_config>
