Miscompilation.cpp revision 640f22e66d90439857a97a83896ee68c4f7128c9
14a10645c70199c8d8567fbc46312158c419720abChris Lattner//===- Miscompilation.cpp - Debug program miscompilations -----------------===//
24a10645c70199c8d8567fbc46312158c419720abChris Lattner//
34a10645c70199c8d8567fbc46312158c419720abChris Lattner// This file implements program miscompilation debugging support.
44a10645c70199c8d8567fbc46312158c419720abChris Lattner//
54a10645c70199c8d8567fbc46312158c419720abChris Lattner//===----------------------------------------------------------------------===//
64a10645c70199c8d8567fbc46312158c419720abChris Lattner
74a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "BugDriver.h"
84a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "SystemUtils.h"
94a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "llvm/Pass.h"
104a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "llvm/Module.h"
11640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner#include "llvm/Transforms/Utils/Cloning.h"
12640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner#include "llvm/Transforms/Utils/Linker.h"
134a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "Support/CommandLine.h"
144a10645c70199c8d8567fbc46312158c419720abChris Lattner
154a10645c70199c8d8567fbc46312158c419720abChris Lattner// Anonymous namespace to define command line options for miscompilation
164a10645c70199c8d8567fbc46312158c419720abChris Lattner// debugging.
174a10645c70199c8d8567fbc46312158c419720abChris Lattner//
184a10645c70199c8d8567fbc46312158c419720abChris Lattnernamespace {
194a10645c70199c8d8567fbc46312158c419720abChris Lattner  // Output - The user can specify a file containing the expected output of the
204a10645c70199c8d8567fbc46312158c419720abChris Lattner  // program.  If this filename is set, it is used as the reference diff source,
214a10645c70199c8d8567fbc46312158c419720abChris Lattner  // otherwise the raw input run through an interpreter is used as the reference
224a10645c70199c8d8567fbc46312158c419720abChris Lattner  // source.
234a10645c70199c8d8567fbc46312158c419720abChris Lattner  //
244a10645c70199c8d8567fbc46312158c419720abChris Lattner  cl::opt<std::string>
254a10645c70199c8d8567fbc46312158c419720abChris Lattner  Output("output", cl::desc("Specify a reference program output "
264a10645c70199c8d8567fbc46312158c419720abChris Lattner			    "(for miscompilation detection)"));
274a10645c70199c8d8567fbc46312158c419720abChris Lattner}
284a10645c70199c8d8567fbc46312158c419720abChris Lattner
29640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnertemplate<typename ElTy>
30640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnerstruct ListReducer {
31640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  enum TestResult {
32640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    NoFailure,         // No failure of the predicate was detected
33640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    KeepSuffix,        // The suffix alone satisfies the predicate
34640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    KeepPrefix,        // The prefix alone satisfies the predicate
35640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  };
36640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
37640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // doTest - This virtual function should be overriden by subclasses to
38640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // implement the test desired.  The testcase is only required to test to see
39640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // if the Kept list still satisfies the property, but if it is going to check
40640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // the prefix anyway, it can.
41640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  //
42640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  virtual TestResult doTest(const std::vector<ElTy> &Prefix,
43640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner                            const std::vector<ElTy> &Kept) = 0;
44640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
45640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // reduceList - This function attempts to reduce the length of the specified
46640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // list while still maintaining the "test" property.  This is the core of the
47640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // "work" that bugpoint does.
48640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  //
49640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  void reduceList(std::vector<ElTy> &TheList) {
50640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    unsigned MidTop = TheList.size();
51640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    while (MidTop > 1) {
52640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner      unsigned Mid = MidTop / 2;
53640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner      std::vector<ElTy> Prefix(TheList.begin()+Mid, TheList.end());
54640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner      std::vector<ElTy> Kept  (TheList.begin(), TheList.begin()+Mid);
55640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
56640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner      switch (doTest(Prefix, Kept)) {
57640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner      case KeepSuffix:
58640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner        // The property still holds.  We can just drop the prefix elements, and
59640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner        // shorten the list to the "kept" elements.
60640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner        TheList.swap(Kept);
61640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner        MidTop = TheList.size();
62640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner        break;
63640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner      case KeepPrefix:
64640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner        // The predicate still holds, shorten the list to the prefix elements.
65640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner        TheList.swap(Prefix);
66640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner        MidTop = TheList.size();
67640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner        break;
68640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner      case NoFailure:
69640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner        // Otherwise the property doesn't hold.  Some of the elements we removed
70640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner        // must be neccesary to maintain the property.
71640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner        MidTop = Mid;
72640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner        break;
73640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner      }
74640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    }
75640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
76640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner};
77640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
78640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnerclass ReduceMiscompilingPasses : public ListReducer<const PassInfo*> {
79640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  BugDriver &BD;
80640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnerpublic:
81640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  ReduceMiscompilingPasses(BugDriver &bd) : BD(bd) {}
82640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
83640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  virtual TestResult doTest(const std::vector<const PassInfo*> &Prefix,
84640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner                            const std::vector<const PassInfo*> &Kept);
85640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner};
86640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
87640f22e66d90439857a97a83896ee68c4f7128c9Chris LattnerReduceMiscompilingPasses::TestResult
88640f22e66d90439857a97a83896ee68c4f7128c9Chris LattnerReduceMiscompilingPasses::doTest(const std::vector<const PassInfo*> &Prefix,
89640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner                                 const std::vector<const PassInfo*> &Kept) {
90640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // First, run the program with just the Kept passes.  If it is still broken
91640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // with JUST the kept passes, discard the prefix passes.
92640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  std::cout << "Checking to see if '" << getPassesString(Kept)
93640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner            << "' compile correctly: ";
94640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
95640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  std::string BytecodeResult;
96640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (BD.runPasses(Kept, BytecodeResult, false/*delete*/, true/*quiet*/)) {
97640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cerr << BD.getToolName() << ": Error running this sequence of passes"
98640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner              << " on the input program!\n";
99640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    exit(1);
100640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
101640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
102640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // Check to see if the finished program matches the reference output...
103640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (BD.diffProgram(Output, BytecodeResult, true /*delete bytecode*/)) {
104640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cout << "nope.\n";
105640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    return KeepSuffix;        // Miscompilation detected!
106640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
107640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  std::cout << "yup.\n";      // No miscompilation!
108640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
109640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (Prefix.empty()) return NoFailure;
110640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
111640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // First, run the program with just the Kept passes.  If it is still broken
112640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // with JUST the kept passes, discard the prefix passes.
113640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  std::cout << "Checking to see if '" << getPassesString(Prefix)
114640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner            << "' compile correctly: ";
115640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
116640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // If it is not broken with the kept passes, it's possible that the prefix
117640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // passes must be run before the kept passes to break it.  If the program
118640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // WORKS after the prefix passes, but then fails if running the prefix AND
119640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // kept passes, we can update our bytecode file to include the result of the
120640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // prefix passes, then discard the prefix passes.
121640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  //
122640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (BD.runPasses(Prefix, BytecodeResult, false/*delete*/, true/*quiet*/)) {
123640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cerr << BD.getToolName() << ": Error running this sequence of passes"
124640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner              << " on the input program!\n";
125640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    exit(1);
126640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
127640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
128640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // If the prefix maintains the predicate by itself, only keep the prefix!
129640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (BD.diffProgram(Output, BytecodeResult)) {
130640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cout << "nope.\n";
131640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    removeFile(BytecodeResult);
132640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    return KeepPrefix;
133640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
134640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  std::cout << "yup.\n";      // No miscompilation!
135640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
136640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // Ok, so now we know that the prefix passes work, try running the suffix
137640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // passes on the result of the prefix passes.
138640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  //
139640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  Module *PrefixOutput = BD.ParseInputFile(BytecodeResult);
140640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (PrefixOutput == 0) {
141640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cerr << BD.getToolName() << ": Error reading bytecode file '"
142640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner              << BytecodeResult << "'!\n";
143640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    exit(1);
144640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
145640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  removeFile(BytecodeResult);  // No longer need the file on disk
146640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
147640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  std::cout << "Checking to see if '" << getPassesString(Kept)
148640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner            << "' passes compile correctly after the '"
149640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner            << getPassesString(Prefix) << "' passes: ";
150640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
151640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  Module *OriginalInput = BD.Program;
152640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  BD.Program = PrefixOutput;
153640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (BD.runPasses(Kept, BytecodeResult, false/*delete*/, true/*quiet*/)) {
154640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cerr << BD.getToolName() << ": Error running this sequence of passes"
155640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner              << " on the input program!\n";
156640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    exit(1);
157640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
158640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
159640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // Run the result...
160640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (BD.diffProgram(Output, BytecodeResult, true/*delete bytecode*/)) {
161640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cout << "nope.\n";
162640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    delete OriginalInput;     // We pruned down the original input...
163640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    return KeepPrefix;
164640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
165640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
166640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // Otherwise, we must not be running the bad pass anymore.
167640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  std::cout << "yup.\n";      // No miscompilation!
168640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  BD.Program = OriginalInput; // Restore original program
169640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  delete PrefixOutput;        // Free experiment
170640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  return NoFailure;
171640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner}
172640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
173640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnerstatic void PrintFunctionList(const std::vector<Function*> &Funcs) {
174640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  for (unsigned i = 0, e = Funcs.size(); i != e; ++i) {
175640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    if (i) std::cout << ", ";
176640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cout << Funcs[i]->getName();
177640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
178640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner}
179640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
180640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
181640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnerclass ReduceMiscompilingFunctions : public ListReducer<Function*> {
182640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  BugDriver &BD;
183640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnerpublic:
184640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  ReduceMiscompilingFunctions(BugDriver &bd) : BD(bd) {}
185640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
186640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  virtual TestResult doTest(const std::vector<Function*> &Prefix,
187640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner                            const std::vector<Function*> &Kept) {
188640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    if (TestFuncs(Kept, false))
189640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner      return KeepSuffix;
190640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    if (TestFuncs(Prefix, false))
191640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner      return KeepPrefix;
192640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    return NoFailure;
193640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
194640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
195640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  bool TestFuncs(const std::vector<Function*> &Prefix, bool EmitBytecode);
196640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner};
197640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
198640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner// DeleteFunctionBody - "Remove" the function by deleting all of it's basic
199640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner// blocks, making it external.
200640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner//
201640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnerstatic void DeleteFunctionBody(Function *F) {
202640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // First, break circular use/def chain references...
203640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I)
204640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    I->dropAllReferences();
205640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
206640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // Next, delete all of the basic blocks.
207640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  F->getBasicBlockList().clear();
208640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
209640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  assert(F->isExternal() && "This didn't make the function external!");
210640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner}
211640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
212640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
213640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnerbool ReduceMiscompilingFunctions::TestFuncs(const std::vector<Function*> &Funcs,
214640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner                                            bool EmitBytecode) {
215640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // Test to see if the function is misoptimized if we ONLY run it on the
216640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // functions listed in Funcs.
217640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (!EmitBytecode) {
218640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cout << "Checking to see if the program is misoptimized when these "
219640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner              << "functions are run\nthrough the passes: ";
220640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    PrintFunctionList(Funcs);
221640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cout << "\n";
222640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  } else {
223640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cout <<"Outputting reduced bytecode files which expose the problem:\n";
224640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
225640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
226640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // First step: clone the module for the two halves of the program we want.
227640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  Module *ToOptimize = CloneModule(BD.Program);
228640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
229640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // Second step: Make sure functions & globals are all external so that linkage
230640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // between the two modules will work.
231640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  for (Module::iterator I = ToOptimize->begin(), E = ToOptimize->end();I!=E;++I)
232640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    I->setLinkage(GlobalValue::ExternalLinkage);
233640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  for (Module::giterator I = ToOptimize->gbegin(), E = ToOptimize->gend();
234640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner       I != E; ++I)
235640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    I->setLinkage(GlobalValue::ExternalLinkage);
236640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
237640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // Third step: make a clone of the externalized program for the non-optimized
238640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // part.
239640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  Module *ToNotOptimize = CloneModule(ToOptimize);
240640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
241640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // Fourth step: Remove the test functions from the ToNotOptimize module, and
242640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // all of the global variables.
243640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  for (unsigned i = 0, e = Funcs.size(); i != e; ++i) {
244640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    Function *TNOF = ToNotOptimize->getFunction(Funcs[i]->getName(),
245640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner                                                Funcs[i]->getFunctionType());
246640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    assert(TNOF && "Function doesn't exist in module!");
247640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    DeleteFunctionBody(TNOF);       // Function is now external in this module!
248640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
249640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  for (Module::giterator I = ToNotOptimize->gbegin(), E = ToNotOptimize->gend();
250640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner       I != E; ++I)
251640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    I->setInitializer(0);  // Delete the initializer to make it external
252640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
253640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (EmitBytecode) {
254640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cout << "  Non-optimized portion: ";
255640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::swap(BD.Program, ToNotOptimize);
256640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    BD.EmitProgressBytecode("tonotoptimize", true);
257640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::swap(BD.Program, ToNotOptimize);
258640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
259640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
260640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // Fifth step: Remove all functions from the ToOptimize module EXCEPT for the
261640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // ones specified in Funcs.  We know which ones these are because they are
262640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // non-external in ToOptimize, but external in ToNotOptimize.
263640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  //
264640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  for (Module::iterator I = ToOptimize->begin(), E = ToOptimize->end();I!=E;++I)
265640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    if (!I->isExternal()) {
266640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner      Function *TNOF = ToNotOptimize->getFunction(I->getName(),
267640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner                                                  I->getFunctionType());
268640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner      assert(TNOF && "Function doesn't exist in ToNotOptimize module??");
269640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner      if (!TNOF->isExternal())
270640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner        DeleteFunctionBody(I);
271640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    }
272640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
273640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (EmitBytecode) {
274640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cout << "  Portion that is input to optimizer: ";
275640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::swap(BD.Program, ToOptimize);
276640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    BD.EmitProgressBytecode("tooptimize");
277640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::swap(BD.Program, ToOptimize);
278640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
279640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
280640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // Sixth step: Run the optimization passes on ToOptimize, producing a
281640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // transformed version of the functions being tested.
282640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  Module *OldProgram = BD.Program;
283640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  BD.Program = ToOptimize;
284640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
285640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (!EmitBytecode)
286640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cout << "  Optimizing functions being tested: ";
287640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  std::string BytecodeResult;
288640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (BD.runPasses(BD.PassesToRun, BytecodeResult, false/*delete*/,
289640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner                   true/*quiet*/)) {
290640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cerr << BD.getToolName() << ": Error running this sequence of passes"
291640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner              << " on the input program!\n";
292640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    exit(1);
293640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
294640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
295640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (!EmitBytecode)
296640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cout << "done.\n";
297640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
298640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  delete BD.Program;   // Delete the old "ToOptimize" module
299640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  BD.Program = BD.ParseInputFile(BytecodeResult);
300640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
301640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (EmitBytecode) {
302640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cout << "  'tooptimize' after being optimized: ";
303640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    BD.EmitProgressBytecode("optimized", true);
304640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
305640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
306640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (BD.Program == 0) {
307640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cerr << BD.getToolName() << ": Error reading bytecode file '"
308640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner              << BytecodeResult << "'!\n";
309640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    exit(1);
310640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
311640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  removeFile(BytecodeResult);  // No longer need the file on disk
312640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
313640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // Seventh step: Link the optimized part of the program back to the
314640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // unoptimized part of the program.
315640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  //
316640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (LinkModules(BD.Program, ToNotOptimize, &BytecodeResult)) {
317640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cerr << BD.getToolName() << ": Error linking modules together:"
318640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner              << BytecodeResult << "\n";
319640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    exit(1);
320640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
321640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  delete ToNotOptimize;  // We are done with this module...
322640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
323640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (EmitBytecode) {
324640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    std::cout << "  Program as tested: ";
325640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    BD.EmitProgressBytecode("linked", true);
326640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    delete BD.Program;
327640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    BD.Program = OldProgram;
328640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    return false;   // We don't need to actually execute the program here.
329640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  }
330640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
331640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  std::cout << "  Checking to see if the merged program executes correctly: ";
332640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
333640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // Eighth step: Execute the program.  If it does not match the expected
334640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // output, then 'Funcs' are being misoptimized!
335640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  bool Broken = BD.diffProgram(Output);
336640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
337640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  delete BD.Program;  // Delete the hacked up program
338640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  BD.Program = OldProgram;   // Restore the original
339640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
340640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  std::cout << (Broken ? "nope.\n" : "yup.\n");
341640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  return Broken;
342640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner}
343640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
344640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
3454a10645c70199c8d8567fbc46312158c419720abChris Lattner/// debugMiscompilation - This method is used when the passes selected are not
3464a10645c70199c8d8567fbc46312158c419720abChris Lattner/// crashing, but the generated output is semantically different from the
3474a10645c70199c8d8567fbc46312158c419720abChris Lattner/// input.
3484a10645c70199c8d8567fbc46312158c419720abChris Lattner///
3494a10645c70199c8d8567fbc46312158c419720abChris Lattnerbool BugDriver::debugMiscompilation() {
3504a10645c70199c8d8567fbc46312158c419720abChris Lattner  std::cout << "*** Debugging miscompilation!\n";
3514a10645c70199c8d8567fbc46312158c419720abChris Lattner
3524a10645c70199c8d8567fbc46312158c419720abChris Lattner  // Set up the execution environment, selecting a method to run LLVM bytecode.
3534a10645c70199c8d8567fbc46312158c419720abChris Lattner  if (initializeExecutionEnvironment()) return true;
3544a10645c70199c8d8567fbc46312158c419720abChris Lattner
3554a10645c70199c8d8567fbc46312158c419720abChris Lattner  // Run the raw input to see where we are coming from.  If a reference output
3564a10645c70199c8d8567fbc46312158c419720abChris Lattner  // was specified, make sure that the raw output matches it.  If not, it's a
3574a10645c70199c8d8567fbc46312158c419720abChris Lattner  // problem in the front-end or whatever produced the input code.
3584a10645c70199c8d8567fbc46312158c419720abChris Lattner  //
3594a10645c70199c8d8567fbc46312158c419720abChris Lattner  bool CreatedOutput = false;
3604a10645c70199c8d8567fbc46312158c419720abChris Lattner  if (Output.empty()) {
3614a10645c70199c8d8567fbc46312158c419720abChris Lattner    std::cout << "Generating reference output from raw program...";
3624a10645c70199c8d8567fbc46312158c419720abChris Lattner    Output = executeProgram("bugpoint.reference.out");
3634a10645c70199c8d8567fbc46312158c419720abChris Lattner    CreatedOutput = true;
364eea21dd91c5d79b406a2a73d9c4769e272a34aabChris Lattner    std::cout << " done! Reference output is: bugpoint.reference.out.\n";
3654a10645c70199c8d8567fbc46312158c419720abChris Lattner  } else if (diffProgram(Output)) {
3664a10645c70199c8d8567fbc46312158c419720abChris Lattner    std::cout << "\n*** Input program does not match reference diff!\n"
3674a10645c70199c8d8567fbc46312158c419720abChris Lattner	      << "    Must be problem with input source!\n";
3684a10645c70199c8d8567fbc46312158c419720abChris Lattner    return false;  // Problem found
3694a10645c70199c8d8567fbc46312158c419720abChris Lattner  }
3704a10645c70199c8d8567fbc46312158c419720abChris Lattner
371640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // Figure out which transformations miscompile the input program.
372640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  unsigned OldSize = PassesToRun.size();
373640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  ReduceMiscompilingPasses(*this).reduceList(PassesToRun);
3744a10645c70199c8d8567fbc46312158c419720abChris Lattner
3754a10645c70199c8d8567fbc46312158c419720abChris Lattner  // Make sure something was miscompiled...
376640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (PassesToRun.size() == OldSize) {
3774a10645c70199c8d8567fbc46312158c419720abChris Lattner    std::cerr << "*** Optimized program matches reference output!  No problem "
3784a10645c70199c8d8567fbc46312158c419720abChris Lattner	      << "detected...\nbugpoint can't help you with your problem!\n";
3794a10645c70199c8d8567fbc46312158c419720abChris Lattner    return false;
3804a10645c70199c8d8567fbc46312158c419720abChris Lattner  }
3814a10645c70199c8d8567fbc46312158c419720abChris Lattner
382640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  std::cout << "\n*** Found miscompiling pass"
383640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner            << (PassesToRun.size() == 1 ? "" : "es") << ": "
384640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner            << getPassesString(PassesToRun) << "\n";
385640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  EmitProgressBytecode("passinput");
3864a10645c70199c8d8567fbc46312158c419720abChris Lattner
3874a10645c70199c8d8567fbc46312158c419720abChris Lattner
388640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // Okay, now that we have reduced the list of passes which are causing the
389640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // failure, see if we can pin down which functions are being
390640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // miscompiled... first build a list of all of the non-external functions in
391640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // the program.
392640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  std::vector<Function*> MiscompiledFunctions;
393640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  for (Module::iterator I = Program->begin(), E = Program->end(); I != E; ++I)
394640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner    if (!I->isExternal())
395640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner      MiscompiledFunctions.push_back(I);
3964a10645c70199c8d8567fbc46312158c419720abChris Lattner
397640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // Do the reduction...
398640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  ReduceMiscompilingFunctions(*this).reduceList(MiscompiledFunctions);
399640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
400640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  std::cout << "\n*** The following functions are being miscompiled: ";
401640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  PrintFunctionList(MiscompiledFunctions);
402640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  std::cout << "\n";
4034a10645c70199c8d8567fbc46312158c419720abChris Lattner
404640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  // Output a bunch of bytecode files for the user...
405640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  ReduceMiscompilingFunctions(*this).TestFuncs(MiscompiledFunctions, true);
4064a10645c70199c8d8567fbc46312158c419720abChris Lattner
407640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (CreatedOutput) removeFile(Output);
4084a10645c70199c8d8567fbc46312158c419720abChris Lattner  return false;
4094a10645c70199c8d8567fbc46312158c419720abChris Lattner}
410