/3rd_party/llvm/utils/findoptdiff
https://code.google.com/p/softart/ · #! · 101 lines · 98 code · 3 blank · 0 comment · 0 complexity · 07521a22778c2f320ec54a6a7e2294d6 MD5 · raw file
- #!/bin/bash
- #
- # findoptdiff
- #
- # This script helps find the optimization difference between two llvm
- # builds. It is useful when you have a build that is known to work and
- # one that exhibits an optimization problem. Identifying the difference
- # between the two builds can lead to discovery of the source of a
- # mis-optimization.
- #
- # The script takes two llvm build paths as arguments. These specify the
- # the two llvm builds to compare. It is generally expected that they
- # are "close cousins". That is, they are the same except that the
- # second build contains some experimental optimization features that
- # are suspected of producing a misoptimization.
- #
- # The script takes two bitcode files, one from each build. They are
- # presumed to be a compilation of the same program or program fragment
- # with the only difference being the builds.
- #
- # The script operates by iteratively applying the optimizations that gccas
- # and gccld run until there is a difference in the assembly resulting
- # from the optimization. The difference is then reported with the set of
- # optimization passes that produce the difference. The processing
- # continues until all optimization passes have been tried. The differences
- # for each pass, if they do differ, are placed in a diffs.# file.
- #
- # To work around differences in the assembly language format, the script
- # can also take two filter arguments that post-process the assembly
- # so they can be differenced without making false positives for known
- # differences in the two builds. These filters are optional.
- #
- # Usage:
- # findoptdiff llvm1 llvm2 bc1 bc2 filter1 filter2
- #
- # Where:
- # llvm1
- # is the path to the first llvm build dir
- # llvm2
- # is the path to the second llvm build dir
- # bc1
- # is the bitcode file for the first llvm environment
- # bc2
- # is the bitcode file for the second llvm environment
- # filter1
- # is an optional filter for filtering the llvm1 generated assembly
- # filter2
- # is an optional filter for filtering the llvm2 generated assembly
- #
- llvm1=$1
- llvm2=$2
- bc1=$3
- bc2=$4
- filt1=$5
- filt2=$6
- if [ -z "$filt1" ] ; then
- filt1="cat"
- fi
- if [ -z "$filt2" ] ; then
- filt2="cat"
- fi
- opt1="${bc1}.opt"
- opt2="${bc2}.opt"
- ll1="${bc1}.ll"
- ll2="${bc2}.ll"
- opt1ll="${bc1}.opt.ll"
- opt2ll="${bc2}.opt.ll"
- dis1="$llvm1/Debug/bin/llvm-dis"
- dis2="$llvm2/Debug/bin/llvm-dis"
- opt1="$llvm1/Debug/bin/opt"
- opt2="$llvm2/Debug/bin/opt"
- all_switches="-verify -lowersetjmp -simplifycfg -mem2reg -globalopt -globaldce -ipconstprop -deadargelim -instcombine -simplifycfg -prune-eh -inline -simplify-libcalls -argpromotion -tailduplicate -simplifycfg -scalarrepl -instcombine -predsimplify -condprop -tailcallelim -simplifycfg -reassociate -licm -loop-unswitch -instcombine -indvars -loop-unroll -instcombine -load-vn -gcse -sccp -instcombine -condprop -dse -dce -simplifycfg -deadtypeelim -constmerge -internalize -ipsccp -globalopt -constmerge -deadargelim -inline -prune-eh -globalopt -globaldce -argpromotion -instcombine -predsimplify -scalarrepl -globalsmodref-aa -licm -load-vn -gcse -dse -instcombine -simplifycfg -verify"
- #counter=0
- function tryit {
- switches_to_use="$1"
- $opt1 $switches_to_use "$bc1" -o - | $dis1 | $filt1 > "$opt1ll"
- $opt2 $switches_to_use "$bc2" -o - | $dis2 | $filt2 > "$opt2ll"
- diffs="diffs."$((counter++))
- diff "$opt1ll" "$opt2ll" > $diffs
- if [ $? -ne 0 ] ; then
- echo
- echo "Diff fails with these switches:"
- echo $switches
- echo "Differences:"
- head $diffs
- echo 'Switches:' $switches_to_use >> $diffs
- else
- rm $diffs
- fi
- return 1
- }
- for sw in $all_switches ; do
- echo -n " $sw"
- switches="$switches $sw"
- if tryit "$switches" ; then
- break;
- fi
- done