findmisopt revision f8463a38bf04b822d009e9e4eaae2e4a3c930da4
128b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer#!/bin/bash 228b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# 328b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# findmisopt 428b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# 528b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# This is a quick and dirty hack to potentially find a misoptimization 628b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# problem. Mostly its to work around problems in bugpoint that prevent 728b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# it from finding a problem unless the set of failing optimizations are 828b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# known and given to it on the command line. 928b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# 1028b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# Given a bytecode file that produces correct output (or return code), 1128b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# this script will run through all the optimizations passes that gccas 1228b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# uses (in the same order) and will narrow down which optimizations 1328b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# cause the program either generate different output or return a 1428b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# different result code. When the passes have been narrowed down, 15a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencer# bugpoint is invoked to further refine the problem to its origin. If a 16a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencer# release version of bugpoint is available it will be used, otherwise 17a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencer# debug. 1828b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# 1928b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# Usage: 2028b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# findmisopt bcfile outdir progargs [match] 2128b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# 2228b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# Where: 2328b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# bcfile 2428b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# is the bytecode file input (the unoptimized working case) 2528b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# outdir 2628b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# is a directory into which intermediate results are placed 2728b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# progargs 2828b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# is a single argument containing all the arguments the program needs 29a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencer# match 3028b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# if specified to any value causes the result code of the program to 3128b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# be used to determine success/fail. If not specified success/fail is 3228b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# determined by diffing the program's output with the non-optimized 3328b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# output. 3428b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# 35e4d8f33b0f1dfe0e6b2741c6936b26f21031ac90Reid Spencerif [ "$#" -lt 3 ] ; then 36e4d8f33b0f1dfe0e6b2741c6936b26f21031ac90Reid Spencer echo "usage: findmisopt bcfile outdir progargs [match]" 37e4d8f33b0f1dfe0e6b2741c6936b26f21031ac90Reid Spencer exit 1 38e4d8f33b0f1dfe0e6b2741c6936b26f21031ac90Reid Spencerfi 39e4d8f33b0f1dfe0e6b2741c6936b26f21031ac90Reid Spencer 40a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencerdir="${0%%/utils/findmisopt}" 41a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencerif [ -x "$dir/Release/bin/bugpoint" ] ; then 42a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencer bugpoint="$dir/Release/bin/bugpoint" 43a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencerelif [ -x "$dir/Debug/bin/bugpoint" ] ; then 44a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencer bugpoint="$dir/Debug/bin/bugpoint" 45a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencerelse 46a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencer echo "findmisopt: bugpoint not found" 47a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencer exit 1 48a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencerfi 49a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencer 5028b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencerbcfile="$1" 5128b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spenceroutdir="$2" 5228b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencerargs="$3" 5328b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencermatch="$4" 5428b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencername=`basename $bcfile .bc` 5528b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencerll="$outdir/${name}.ll" 5628b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencers="$outdir/${name}.s" 5728b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencerprog="$outdir/${name}" 5828b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencerout="$outdir/${name}.out" 5928b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spenceroptbc="$outdir/${name}.opt.bc" 6028b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spenceroptll="$outdir/${name}.opt.ll" 6128b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spenceropts="$outdir/${name}.opt.s" 6228b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spenceroptprog="$outdir/${name}.opt" 6328b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spenceroptout="$outdir/${name}.opt.out" 64f8463a38bf04b822d009e9e4eaae2e4a3c930da4Reid Spencerldflags="-lstdc++ -lm -ldl -lc" 6528b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer 6628b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencerecho "Test Name: $name" 6728b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencerecho "Unoptimized program: $prog" 6828b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencerecho " Optimized program: $optprog" 6928b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer 70024409995684ed37250a0d6dec4956316368a42aReid Spencer# Create output directory if it doesn't exist 71024409995684ed37250a0d6dec4956316368a42aReid Spencerif [ -f "$outdir" ] ; then 72024409995684ed37250a0d6dec4956316368a42aReid Spencer echo "$outdir is not a directory" 73024409995684ed37250a0d6dec4956316368a42aReid Spencer exit 1 74024409995684ed37250a0d6dec4956316368a42aReid Spencerfi 75024409995684ed37250a0d6dec4956316368a42aReid Spencer 76024409995684ed37250a0d6dec4956316368a42aReid Spencerif [ ! -d "$outdir" ] ; then 77024409995684ed37250a0d6dec4956316368a42aReid Spencer mkdir "$outdir" || exit 1 78024409995684ed37250a0d6dec4956316368a42aReid Spencerfi 7928b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer 8028b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# Generate the disassembly 8128b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencerllvm-dis "$bcfile" -o "$ll" -f || exit 1 8228b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer 8328b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# Generate the non-optimized program 8428b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencerllc "$bcfile" -o "$s" -f || exit 1 85f8463a38bf04b822d009e9e4eaae2e4a3c930da4Reid Spencergcc "$s" -o "$prog" $ldflags || exit 1 8628b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer 87a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencer# Define the list of optimizations to run. This comprises the same set of 88a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencer# optimizations that gccas and gccld run, in the same order. 895b31cf0f9f53b08bed1e792aade56ef6d7c87e27Reid Spencerall_switches="-verify -lowersetjmp -funcresolve -raiseallocs -simplifycfg -mem2reg -globalopt -globaldce -ipconstprop -deadargelim -instcombine -simplifycfg -prune-eh -inline -simplify-libcalls -argpromotion -raise -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 -funcresolve -internalize -ipsccp -globalopt -constmerge -deadargelim -inline -prune-eh -globalopt -globaldce -argpromotion -instcombine -predsimplify -scalarrepl -globalsmodref-aa -licm -load-vn -gcse -dse -instcombine -simplifycfg -verify" 905b31cf0f9f53b08bed1e792aade56ef6d7c87e27Reid Spencer# Here's an alternative list of optimizations comprising just the ones that 915b31cf0f9f53b08bed1e792aade56ef6d7c87e27Reid Spencer# gccld uses. To use, just comment out the line above, and uncomment this one 925b31cf0f9f53b08bed1e792aade56ef6d7c87e27Reid Spencer#all_switches="-funcresolve -internalize -ipsccp -globalopt -constmerge -deadargelim -inline -prune-eh -globalopt -globaldce -argpromotion -instcombine -predsimplify -scalarrepl -globalsmodref-aa -licm -load-vn -gcse -dse -instcombine -simplifycfg -verify" 9328b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer 9428b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer# Current set of switches is empty 9528b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencerfunction tryit { 9628b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer switches_to_use="$1" 9728b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer opt $switches_to_use "$bcfile" -o "$optbc" -f || exit 9828b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer llvm-dis "$optbc" -o "$optll" -f || exit 9928b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer llc "$optbc" -o "$opts" -f || exit 100f8463a38bf04b822d009e9e4eaae2e4a3c930da4Reid Spencer gcc "$opts" -o "$optprog" $ldflags || exit 101024409995684ed37250a0d6dec4956316368a42aReid Spencer "$prog" $args > "$out" 2>&1 10228b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer ex1=$? 103024409995684ed37250a0d6dec4956316368a42aReid Spencer "$optprog" $args > "$optout" 2>&1 10428b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer ex2=$? 10528b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer 10628b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer if [ -n "$match" ] ; then 10728b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer if [ "$ex1" -ne "$ex2" ] ; then 10828b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer echo "Return code not the same with these switches:" 10928b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer echo $switches 11028b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer echo "Unoptimized returned: $ex1" 11128b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer echo "Optimized returned: $ex2" 11228b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer return 0 11328b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer fi 11428b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer else 11528b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer diff "$out" "$optout" > /dev/null 11628b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer if [ $? -ne 0 ] ; then 11728b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer echo "Diff fails with these switches:" 11828b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer echo $switches 11928b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer echo "Differences:" 120ba07a6922289d65690ce5f39301cd7e75c97d89eReid Spencer diff "$out" "$optout" | head 12128b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer return 0; 12228b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer fi 12328b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer fi 12428b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer return 1 12528b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer} 12628b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer 127024409995684ed37250a0d6dec4956316368a42aReid Spencerecho "Trying to find optimization that breaks program:" 12828b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencerfor sw in $all_switches ; do 129024409995684ed37250a0d6dec4956316368a42aReid Spencer echo -n " $sw" 13028b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer switches="$switches $sw" 13128b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer if tryit "$switches" ; then 13228b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer break; 13328b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer fi 13428b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencerdone 13528b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer 1366d0fbd4185ae24f342459b1ed4ab45062bff1a66Reid Spencer# Terminate the previous output with a newline 1376d0fbd4185ae24f342459b1ed4ab45062bff1a66Reid Spencerecho "" 1386d0fbd4185ae24f342459b1ed4ab45062bff1a66Reid Spencer 1396d0fbd4185ae24f342459b1ed4ab45062bff1a66Reid Spencer# Determine if we're done because none of the optimizations broke the program 1406d0fbd4185ae24f342459b1ed4ab45062bff1a66Reid Spencerif [ "$switches" == " $all_switches" ] ; then 1416d0fbd4185ae24f342459b1ed4ab45062bff1a66Reid Spencer echo "The program did not miscompile" 1426d0fbd4185ae24f342459b1ed4ab45062bff1a66Reid Spencer exit 0 1436d0fbd4185ae24f342459b1ed4ab45062bff1a66Reid Spencerfi 1446d0fbd4185ae24f342459b1ed4ab45062bff1a66Reid Spencer 14528b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencerfinal="" 14628b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencerwhile [ ! -z "$switches" ] ; do 14728b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer trimmed=`echo "$switches" | sed -e 's/^ *\(-[^ ]*\).*/\1/'` 14828b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer switches=`echo "$switches" | sed -e 's/^ *-[^ ]* *//'` 14928b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer echo "Trimmed $trimmed from left" 15028b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer tryit "$final $switches" 15128b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer if [ "$?" -eq "0" ] ; then 15228b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer echo "Still Failing .. continuing ..." 15328b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer continue 15428b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer else 15528b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer echo "Found required early pass: $trimmed" 15628b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer final="$final $trimmed" 15728b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer continue 15828b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer fi 15928b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer echo "Next Loop" 16028b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencerdone 16128b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer 162dd2b95534f866ec6f31df101624a715612c97ffaReid Spencerif [ "$final" == " $all_switches" ] ; then 163024409995684ed37250a0d6dec4956316368a42aReid Spencer echo "findmisopt: All optimizations pass. Perhaps this isn't a misopt?" 164dd2b95534f866ec6f31df101624a715612c97ffaReid Spencer exit 0 165dd2b95534f866ec6f31df101624a715612c97ffaReid Spencerfi 166dd2b95534f866ec6f31df101624a715612c97ffaReid Spencerecho "Smallest Optimization list=$final" 167a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencer 168a8c3ff456aedbc55ac5ccd853e721812d0369ea0Reid Spencerbpcmd="$bugpoint -run-llc -disable-loop-extraction --output "$out" --input /dev/null $bcfile $final --args $args" 16928b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer 17028b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencerecho "Running: $bpcmd" 17128b7c7feab6219f4c9c7efc3b71a0a3f4880a14dReid Spencer$bpcmd 172dd2b95534f866ec6f31df101624a715612c97ffaReid Spencerecho "findmisopt finished." 173