Miscompilation.cpp revision 74382b7c699120fbec5cb5603c9cf4212eb37f06
14a10645c70199c8d8567fbc46312158c419720abChris Lattner//===- Miscompilation.cpp - Debug program miscompilations -----------------===// 23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// The LLVM Compiler Infrastructure 47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// 521c62da287237d39d0d95004881ea4baae3be6daChris Lattner// This file is distributed under the University of Illinois Open Source 621c62da287237d39d0d95004881ea4baae3be6daChris Lattner// License. See LICENSE.TXT for details. 73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//===----------------------------------------------------------------------===// 94a10645c70199c8d8567fbc46312158c419720abChris Lattner// 10a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner// This file implements optimizer and code generation miscompilation debugging 11a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner// support. 124a10645c70199c8d8567fbc46312158c419720abChris Lattner// 134a10645c70199c8d8567fbc46312158c419720abChris Lattner//===----------------------------------------------------------------------===// 144a10645c70199c8d8567fbc46312158c419720abChris Lattner 154a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "BugDriver.h" 16126840f49e8d49156a342e836d4b2adca46dc3baChris Lattner#include "ListReducer.h" 17ca7409664273fed4b473127295af3af0836b3077Daniel Dunbar#include "ToolRunner.h" 18a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner#include "llvm/Constants.h" 19a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner#include "llvm/DerivedTypes.h" 20a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner#include "llvm/Instructions.h" 21605b9e2c5bd1b0c151a0b15d01e6df3aba93d52fReid Spencer#include "llvm/Linker.h" 224a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "llvm/Module.h" 23e49603d79d220a795bd50684c8b1f503ee40f97fMisha Brukman#include "llvm/Pass.h" 24a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner#include "llvm/Analysis/Verifier.h" 25a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner#include "llvm/Support/Mangler.h" 26640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner#include "llvm/Transforms/Utils/Cloning.h" 27551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/CommandLine.h" 28551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/FileUtilities.h" 2959615f0f85e2ac99e012cb81934d002faebd405aChris Lattner#include "llvm/Config/config.h" // for HAVE_LINK_R 30fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattnerusing namespace llvm; 314a10645c70199c8d8567fbc46312158c419720abChris Lattner 32a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattnernamespace llvm { 33a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner extern cl::list<std::string> InputArgv; 34a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner} 35a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 36efdc0b505712d1ca4460def27e51c430f033d58dChris Lattnernamespace { 37dc31a8a70cab3b4c180ac1a482855e31d3fe8e6bReid Spencer static llvm::cl::opt<bool> 38dc31a8a70cab3b4c180ac1a482855e31d3fe8e6bReid Spencer DisableLoopExtraction("disable-loop-extraction", 39dc31a8a70cab3b4c180ac1a482855e31d3fe8e6bReid Spencer cl::desc("Don't extract loops when searching for miscompilations"), 40dc31a8a70cab3b4c180ac1a482855e31d3fe8e6bReid Spencer cl::init(false)); 41265d82e4c68fa30b7ff1cb650456249f7068bdd6David Goodwin static llvm::cl::opt<bool> 42265d82e4c68fa30b7ff1cb650456249f7068bdd6David Goodwin DisableBlockExtraction("disable-block-extraction", 43265d82e4c68fa30b7ff1cb650456249f7068bdd6David Goodwin cl::desc("Don't extract blocks when searching for miscompilations"), 44265d82e4c68fa30b7ff1cb650456249f7068bdd6David Goodwin cl::init(false)); 45dc31a8a70cab3b4c180ac1a482855e31d3fe8e6bReid Spencer 46fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner class ReduceMiscompilingPasses : public ListReducer<const PassInfo*> { 47fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner BugDriver &BD; 48fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner public: 49fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner ReduceMiscompilingPasses(BugDriver &bd) : BD(bd) {} 503da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 51fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner virtual TestResult doTest(std::vector<const PassInfo*> &Prefix, 52fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner std::vector<const PassInfo*> &Suffix); 53fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner }; 54fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner} 55640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 568c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// TestResult - After passes have been split into a test group and a control 578c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// group, see if they still break the program. 588c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 59640f22e66d90439857a97a83896ee68c4f7128c9Chris LattnerReduceMiscompilingPasses::TestResult 6039aebca3a2d1dd389a6d9cdfb51a53f625e244f0Chris LattnerReduceMiscompilingPasses::doTest(std::vector<const PassInfo*> &Prefix, 6106943add8b2b764e131979cca064eda9f28826c9Chris Lattner std::vector<const PassInfo*> &Suffix) { 6206943add8b2b764e131979cca064eda9f28826c9Chris Lattner // First, run the program with just the Suffix passes. If it is still broken 63640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // with JUST the kept passes, discard the prefix passes. 64ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "Checking to see if '" << getPassesString(Suffix) 65ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << "' compiles correctly: "; 66640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 678ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif std::string BitcodeResult; 688ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif if (BD.runPasses(Suffix, BitcodeResult, false/*delete*/, true/*quiet*/)) { 6965f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << " Error running this sequence of passes" 7065f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << " on the input program!\n"; 715ef681c19de9c675a265211f8fb0ae49cc3a3a66Chris Lattner BD.setPassesToRun(Suffix); 728ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif BD.EmitProgressBitcode("pass-error", false); 73025262692a6710de29a48e2b3905672cd12d13d2Chris Lattner exit(BD.debugOptimizerCrash()); 74640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 759adc0abad3c3ed40a268ccbcee0c74cb9e1359feOwen Anderson 76640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Check to see if the finished program matches the reference output... 778ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif if (BD.diffProgram(BitcodeResult, "", true /*delete bitcode*/)) { 78ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << " nope.\n"; 7959615f0f85e2ac99e012cb81934d002faebd405aChris Lattner if (Suffix.empty()) { 8065f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << BD.getToolName() << ": I'm confused: the test fails when " 8165f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << "no passes are run, nondeterministic program?\n"; 8259615f0f85e2ac99e012cb81934d002faebd405aChris Lattner exit(1); 8359615f0f85e2ac99e012cb81934d002faebd405aChris Lattner } 84123f8fec94d1f22d876382897231868c62f8eabbMisha Brukman return KeepSuffix; // Miscompilation detected! 85640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 86ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << " yup.\n"; // No miscompilation! 87640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 88640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (Prefix.empty()) return NoFailure; 89640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 9006943add8b2b764e131979cca064eda9f28826c9Chris Lattner // Next, see if the program is broken if we run the "prefix" passes first, 91bc0e998c497446f5448425b3cbd7f8f19a458764Misha Brukman // then separately run the "kept" passes. 92ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "Checking to see if '" << getPassesString(Prefix) 93ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << "' compiles correctly: "; 94640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 95640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // If it is not broken with the kept passes, it's possible that the prefix 96640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // passes must be run before the kept passes to break it. If the program 97640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // WORKS after the prefix passes, but then fails if running the prefix AND 988ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif // kept passes, we can update our bitcode file to include the result of the 99640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // prefix passes, then discard the prefix passes. 100640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // 1018ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif if (BD.runPasses(Prefix, BitcodeResult, false/*delete*/, true/*quiet*/)) { 10265f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << " Error running this sequence of passes" 10365f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << " on the input program!\n"; 1049c6cfe1bffd37f29a265457b7515839c445b3e6aChris Lattner BD.setPassesToRun(Prefix); 1058ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif BD.EmitProgressBitcode("pass-error", false); 106025262692a6710de29a48e2b3905672cd12d13d2Chris Lattner exit(BD.debugOptimizerCrash()); 107640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 108640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 109640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // If the prefix maintains the predicate by itself, only keep the prefix! 1108ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif if (BD.diffProgram(BitcodeResult)) { 111ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << " nope.\n"; 1128ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif sys::Path(BitcodeResult).eraseFromDisk(); 113640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner return KeepPrefix; 114640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 115ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << " yup.\n"; // No miscompilation! 116640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 117640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Ok, so now we know that the prefix passes work, try running the suffix 118640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // passes on the result of the prefix passes. 119640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // 1208b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson Module *PrefixOutput = ParseInputFile(BitcodeResult, BD.getContext()); 121640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (PrefixOutput == 0) { 12265f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << BD.getToolName() << ": Error reading bitcode file '" 12365f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << BitcodeResult << "'!\n"; 124640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner exit(1); 125640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 1268ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif sys::Path(BitcodeResult).eraseFromDisk(); // No longer need the file on disk 127f4789e6d04c1fddb40092a1193c4a5eb67387accChris Lattner 128f4789e6d04c1fddb40092a1193c4a5eb67387accChris Lattner // Don't check if there are no passes in the suffix. 129f4789e6d04c1fddb40092a1193c4a5eb67387accChris Lattner if (Suffix.empty()) 130f4789e6d04c1fddb40092a1193c4a5eb67387accChris Lattner return NoFailure; 1313da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 132ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "Checking to see if '" << getPassesString(Suffix) 133640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << "' passes compile correctly after the '" 134640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << getPassesString(Prefix) << "' passes: "; 135640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 136efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner Module *OriginalInput = BD.swapProgramIn(PrefixOutput); 1378ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif if (BD.runPasses(Suffix, BitcodeResult, false/*delete*/, true/*quiet*/)) { 13865f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << " Error running this sequence of passes" 13965f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << " on the input program!\n"; 1405ef681c19de9c675a265211f8fb0ae49cc3a3a66Chris Lattner BD.setPassesToRun(Suffix); 1418ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif BD.EmitProgressBitcode("pass-error", false); 142025262692a6710de29a48e2b3905672cd12d13d2Chris Lattner exit(BD.debugOptimizerCrash()); 143640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 144640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 145640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Run the result... 1468ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif if (BD.diffProgram(BitcodeResult, "", true/*delete bitcode*/)) { 147ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << " nope.\n"; 148640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner delete OriginalInput; // We pruned down the original input... 14906943add8b2b764e131979cca064eda9f28826c9Chris Lattner return KeepSuffix; 150640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 151640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 152640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Otherwise, we must not be running the bad pass anymore. 153ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << " yup.\n"; // No miscompilation! 154efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner delete BD.swapProgramIn(OriginalInput); // Restore orig program & free test 155640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner return NoFailure; 156640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner} 157640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 158efdc0b505712d1ca4460def27e51c430f033d58dChris Lattnernamespace { 159fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner class ReduceMiscompilingFunctions : public ListReducer<Function*> { 160fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner BugDriver &BD; 161b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner bool (*TestFn)(BugDriver &, Module *, Module *); 162fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner public: 163b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner ReduceMiscompilingFunctions(BugDriver &bd, 164b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner bool (*F)(BugDriver &, Module *, Module *)) 165b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner : BD(bd), TestFn(F) {} 1663da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 167fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner virtual TestResult doTest(std::vector<Function*> &Prefix, 168fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner std::vector<Function*> &Suffix) { 169be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner if (!Suffix.empty() && TestFuncs(Suffix)) 170fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner return KeepSuffix; 171be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner if (!Prefix.empty() && TestFuncs(Prefix)) 172fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner return KeepPrefix; 173fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner return NoFailure; 174fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner } 1753da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 176be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner bool TestFuncs(const std::vector<Function*> &Prefix); 177fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner }; 178fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner} 179640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 180efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner/// TestMergedProgram - Given two modules, link them together and run the 181efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner/// program, checking to see if the program matches the diff. If the diff 182a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner/// matches, return false, otherwise return true. If the DeleteInputs argument 183a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner/// is set to true then this function deletes both input modules before it 184a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner/// returns. 1858c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 186a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattnerstatic bool TestMergedProgram(BugDriver &BD, Module *M1, Module *M2, 187a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner bool DeleteInputs) { 188efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner // Link the two portions of the program back to together. 189efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner std::string ErrorMsg; 19090c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner if (!DeleteInputs) { 19190c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner M1 = CloneModule(M1); 19290c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner M2 = CloneModule(M2); 19390c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner } 194e4874029c37c4b14d0646289f18e5f2a1b03fdc2Reid Spencer if (Linker::LinkModules(M1, M2, &ErrorMsg)) { 19565f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << BD.getToolName() << ": Error linking modules together:" 19665f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << ErrorMsg << '\n'; 197efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner exit(1); 198efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner } 19990c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner delete M2; // We are done with this module. 200efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner 201efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner Module *OldProgram = BD.swapProgramIn(M1); 202efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner 203efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner // Execute the program. If it does not match the expected output, we must 204efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner // return true. 205efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner bool Broken = BD.diffProgram(); 206efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner 207efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner // Delete the linked module & restore the original 208a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner BD.swapProgramIn(OldProgram); 2095313f23b8c3d22a2028beb731c60fc1a25beb149Chris Lattner delete M1; 210efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner return Broken; 211efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner} 212efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner 2138c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// TestFuncs - split functions in a Module into two groups: those that are 2148c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// under consideration for miscompilation vs. those that are not, and test 2158c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// accordingly. Each group of functions becomes a separate Module. 2168c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 217be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattnerbool ReduceMiscompilingFunctions::TestFuncs(const std::vector<Function*>&Funcs){ 218640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Test to see if the function is misoptimized if we ONLY run it on the 219640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // functions listed in Funcs. 220ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "Checking to see if the program is misoptimized when " 221ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << (Funcs.size()==1 ? "this function is" : "these functions are") 222ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << " run through the pass" 223ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << (BD.getPassesToRun().size() == 1 ? "" : "es") << ":"; 224efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner PrintFunctionList(Funcs); 225ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << '\n'; 226640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 227be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner // Split the module into the two halves of the program we want. 228d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman DenseMap<const Value*, Value*> ValueMap; 229d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman Module *ToNotOptimize = CloneModule(BD.getProgram(), ValueMap); 230d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman Module *ToOptimize = SplitFunctionsOutOfModule(ToNotOptimize, Funcs, 231d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman ValueMap); 232640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 2336fa98b13206583e6eb90b8304758b35548914944Nick Lewycky // Run the predicate, note that the predicate will delete both input modules. 234b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner return TestFn(BD, ToOptimize, ToNotOptimize); 235640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner} 236640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 2378c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// DisambiguateGlobalSymbols - Mangle symbols to guarantee uniqueness by 2388c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// modifying predominantly internal symbols rather than external ones. 2398c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 24036ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattnerstatic void DisambiguateGlobalSymbols(Module *M) { 24136ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner // Try not to cause collisions by minimizing chances of renaming an 24236ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner // already-external symbol, so take in external globals and functions as-is. 24336ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner // The code should work correctly without disambiguation (assuming the same 24436ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner // mangler is used by the two code generators), but having symbols with the 24536ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner // same name causes warnings to be emitted by the code generator. 24636ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner Mangler Mang(*M); 2470fccc74103dee95d6baa885963b7337ae5daec7eAndrew Lenharth // Agree with the CBE on symbol naming 2480fccc74103dee95d6baa885963b7337ae5daec7eAndrew Lenharth Mang.markCharUnacceptable('.'); 24967ef9e43049c28c8fe2c9f70d2ad163045ee5876Chris Lattner for (Module::global_iterator I = M->global_begin(), E = M->global_end(); 2509d5511b7db2c42a2cea0ca00c0e123e64cceadaeChris Lattner I != E; ++I) { 2519d5511b7db2c42a2cea0ca00c0e123e64cceadaeChris Lattner // Don't mangle asm names. 2529d5511b7db2c42a2cea0ca00c0e123e64cceadaeChris Lattner if (!I->hasName() || I->getName()[0] != 1) 2539d5511b7db2c42a2cea0ca00c0e123e64cceadaeChris Lattner I->setName(Mang.getMangledName(I)); 2549d5511b7db2c42a2cea0ca00c0e123e64cceadaeChris Lattner } 2559d5511b7db2c42a2cea0ca00c0e123e64cceadaeChris Lattner for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I) { 2564285d15703d4282cccb1e311b798917abd06beafChris Lattner // Don't mangle asm names or intrinsics. 257e0d5c17921ddcdfce0fbfd7dd5dd993acb56304cChris Lattner if ((!I->hasName() || I->getName()[0] != 1) && 258e0d5c17921ddcdfce0fbfd7dd5dd993acb56304cChris Lattner I->getIntrinsicID() == 0) 2599d5511b7db2c42a2cea0ca00c0e123e64cceadaeChris Lattner I->setName(Mang.getMangledName(I)); 2609d5511b7db2c42a2cea0ca00c0e123e64cceadaeChris Lattner } 26136ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner} 26236ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner 263a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner/// ExtractLoops - Given a reduced list of functions that still exposed the bug, 264a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner/// check to see if we can extract the loops in the region without obscuring the 265a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner/// bug. If so, it reduces the amount of code identified. 2668c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 267b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattnerstatic bool ExtractLoops(BugDriver &BD, 268b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner bool (*TestFn)(BugDriver &, Module *, Module *), 269a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner std::vector<Function*> &MiscompiledFunctions) { 270a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner bool MadeChange = false; 271a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner while (1) { 272aed98fa8861a28e5f7ba7c0659e106f2a441e9ffChris Lattner if (BugpointIsInterrupted) return MadeChange; 273aed98fa8861a28e5f7ba7c0659e106f2a441e9ffChris Lattner 274d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman DenseMap<const Value*, Value*> ValueMap; 275d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman Module *ToNotOptimize = CloneModule(BD.getProgram(), ValueMap); 276a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner Module *ToOptimize = SplitFunctionsOutOfModule(ToNotOptimize, 277d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman MiscompiledFunctions, 278d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman ValueMap); 279a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner Module *ToOptimizeLoopExtracted = BD.ExtractLoop(ToOptimize); 280a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner if (!ToOptimizeLoopExtracted) { 281a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // If the loop extractor crashed or if there were no extractible loops, 282a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // then this chapter of our odyssey is over with. 283a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner delete ToNotOptimize; 284a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner delete ToOptimize; 285a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner return MadeChange; 286a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner } 287a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner 28865f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << "Extracted a loop from the breaking portion of the program.\n"; 289a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner 290a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // Bugpoint is intentionally not very trusting of LLVM transformations. In 291a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // particular, we're not going to assume that the loop extractor works, so 292a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // we're going to test the newly loop extracted program to make sure nothing 293a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // has broken. If something broke, then we'll inform the user and stop 294a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // extraction. 29570ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman AbstractInterpreter *AI = BD.switchToSafeInterpreter(); 296a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner if (TestMergedProgram(BD, ToOptimizeLoopExtracted, ToNotOptimize, false)) { 297a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner BD.switchToInterpreter(AI); 298a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 299a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // Merged program doesn't work anymore! 30065f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << " *** ERROR: Loop extraction broke the program. :(" 30165f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << " Please report a bug!\n"; 30265f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << " Continuing on with un-loop-extracted version.\n"; 30356c418676a308034e5eecf10d3f96ced2d1fab24Chris Lattner 30456c418676a308034e5eecf10d3f96ced2d1fab24Chris Lattner BD.writeProgramToFile("bugpoint-loop-extract-fail-tno.bc", ToNotOptimize); 30556c418676a308034e5eecf10d3f96ced2d1fab24Chris Lattner BD.writeProgramToFile("bugpoint-loop-extract-fail-to.bc", ToOptimize); 30656c418676a308034e5eecf10d3f96ced2d1fab24Chris Lattner BD.writeProgramToFile("bugpoint-loop-extract-fail-to-le.bc", 30756c418676a308034e5eecf10d3f96ced2d1fab24Chris Lattner ToOptimizeLoopExtracted); 30856c418676a308034e5eecf10d3f96ced2d1fab24Chris Lattner 30965f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << "Please submit the bugpoint-loop-extract-fail-*.bc files.\n"; 31056c418676a308034e5eecf10d3f96ced2d1fab24Chris Lattner delete ToOptimize; 311a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner delete ToNotOptimize; 312a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner delete ToOptimizeLoopExtracted; 313a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner return MadeChange; 314a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner } 31556c418676a308034e5eecf10d3f96ced2d1fab24Chris Lattner delete ToOptimize; 316a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner BD.switchToInterpreter(AI); 3173da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 318ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << " Testing after loop extraction:\n"; 319b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner // Clone modules, the tester function will free them. 320b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner Module *TOLEBackup = CloneModule(ToOptimizeLoopExtracted); 321b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner Module *TNOBackup = CloneModule(ToNotOptimize); 322b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner if (!TestFn(BD, ToOptimizeLoopExtracted, ToNotOptimize)) { 323ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "*** Loop extraction masked the problem. Undoing.\n"; 324a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // If the program is not still broken, then loop extraction did something 325a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // that masked the error. Stop loop extraction now. 326b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner delete TOLEBackup; 327b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner delete TNOBackup; 328a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner return MadeChange; 329a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner } 330b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner ToOptimizeLoopExtracted = TOLEBackup; 331b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner ToNotOptimize = TNOBackup; 332b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner 333ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "*** Loop extraction successful!\n"; 334a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner 33590c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner std::vector<std::pair<std::string, const FunctionType*> > MisCompFunctions; 33690c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner for (Module::iterator I = ToOptimizeLoopExtracted->begin(), 33790c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner E = ToOptimizeLoopExtracted->end(); I != E; ++I) 3385cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (!I->isDeclaration()) 339fa1af1344910ee975f50ffdddf605c26f80ef016Chris Lattner MisCompFunctions.push_back(std::make_pair(I->getName(), 340fa1af1344910ee975f50ffdddf605c26f80ef016Chris Lattner I->getFunctionType())); 34190c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner 342a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // Okay, great! Now we know that we extracted a loop and that loop 343a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // extraction both didn't break the program, and didn't mask the problem. 344a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // Replace the current program with the loop extracted version, and try to 345a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // extract another loop. 346a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner std::string ErrorMsg; 347e4874029c37c4b14d0646289f18e5f2a1b03fdc2Reid Spencer if (Linker::LinkModules(ToNotOptimize, ToOptimizeLoopExtracted, &ErrorMsg)){ 34865f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << BD.getToolName() << ": Error linking modules together:" 34965f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << ErrorMsg << '\n'; 350a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner exit(1); 351a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner } 35290c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner delete ToOptimizeLoopExtracted; 353d3a533d94dae1e57194001af08763eb3ba199c8fChris Lattner 354d3a533d94dae1e57194001af08763eb3ba199c8fChris Lattner // All of the Function*'s in the MiscompiledFunctions list are in the old 3555313f23b8c3d22a2028beb731c60fc1a25beb149Chris Lattner // module. Update this list to include all of the functions in the 3565313f23b8c3d22a2028beb731c60fc1a25beb149Chris Lattner // optimized and loop extracted module. 3575313f23b8c3d22a2028beb731c60fc1a25beb149Chris Lattner MiscompiledFunctions.clear(); 35890c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) { 359ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer Function *NewF = ToNotOptimize->getFunction(MisCompFunctions[i].first); 360ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer 36190c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner assert(NewF && "Function not found??"); 362ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer assert(NewF->getFunctionType() == MisCompFunctions[i].second && 363ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer "found wrong function type?"); 36490c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner MiscompiledFunctions.push_back(NewF); 365d3a533d94dae1e57194001af08763eb3ba199c8fChris Lattner } 366d3a533d94dae1e57194001af08763eb3ba199c8fChris Lattner 367a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner BD.setNewProgram(ToNotOptimize); 368a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner MadeChange = true; 369a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner } 370a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner} 371a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner 3725e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattnernamespace { 3735e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner class ReduceMiscompiledBlocks : public ListReducer<BasicBlock*> { 3745e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner BugDriver &BD; 3755e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner bool (*TestFn)(BugDriver &, Module *, Module *); 3765e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner std::vector<Function*> FunctionsBeingTested; 3775e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner public: 3785e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner ReduceMiscompiledBlocks(BugDriver &bd, 3795e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner bool (*F)(BugDriver &, Module *, Module *), 3805e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner const std::vector<Function*> &Fns) 3815e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner : BD(bd), TestFn(F), FunctionsBeingTested(Fns) {} 3823da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 3835e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner virtual TestResult doTest(std::vector<BasicBlock*> &Prefix, 3845e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner std::vector<BasicBlock*> &Suffix) { 3855e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner if (!Suffix.empty() && TestFuncs(Suffix)) 3865e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner return KeepSuffix; 3875e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner if (TestFuncs(Prefix)) 3885e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner return KeepPrefix; 3895e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner return NoFailure; 3905e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner } 3913da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 3925e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner bool TestFuncs(const std::vector<BasicBlock*> &Prefix); 3935e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner }; 3945e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner} 3955e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 3965e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner/// TestFuncs - Extract all blocks for the miscompiled functions except for the 3975e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner/// specified blocks. If the problem still exists, return true. 3985e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner/// 3995e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattnerbool ReduceMiscompiledBlocks::TestFuncs(const std::vector<BasicBlock*> &BBs) { 4005e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Test to see if the function is misoptimized if we ONLY run it on the 4015e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // functions listed in Funcs. 402ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "Checking to see if the program is misoptimized when all "; 40368bee938e539d884ee89ce4dfebbad777896960eChris Lattner if (!BBs.empty()) { 404ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "but these " << BBs.size() << " blocks are extracted: "; 40568bee938e539d884ee89ce4dfebbad777896960eChris Lattner for (unsigned i = 0, e = BBs.size() < 10 ? BBs.size() : 10; i != e; ++i) 406ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << BBs[i]->getName() << " "; 407ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman if (BBs.size() > 10) outs() << "..."; 40868bee938e539d884ee89ce4dfebbad777896960eChris Lattner } else { 409ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "blocks are extracted."; 41068bee938e539d884ee89ce4dfebbad777896960eChris Lattner } 411ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << '\n'; 4125e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 4135e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Split the module into the two halves of the program we want. 414d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman DenseMap<const Value*, Value*> ValueMap; 415d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman Module *ToNotOptimize = CloneModule(BD.getProgram(), ValueMap); 4165e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner Module *ToOptimize = SplitFunctionsOutOfModule(ToNotOptimize, 417d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman FunctionsBeingTested, 418d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman ValueMap); 4195e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 4205e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Try the extraction. If it doesn't work, then the block extractor crashed 4215e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // or something, in which case bugpoint can't chase down this possibility. 4225e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner if (Module *New = BD.ExtractMappedBlocksFromModule(BBs, ToOptimize)) { 4235e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner delete ToOptimize; 4245e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Run the predicate, not that the predicate will delete both input modules. 4255e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner return TestFn(BD, New, ToNotOptimize); 4265e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner } 4275e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner delete ToOptimize; 4285e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner delete ToNotOptimize; 4295e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner return false; 4305e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner} 4315e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 4325e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 4335e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner/// ExtractBlocks - Given a reduced list of functions that still expose the bug, 4345e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner/// extract as many basic blocks from the region as possible without obscuring 4355e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner/// the bug. 4365e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner/// 4375e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattnerstatic bool ExtractBlocks(BugDriver &BD, 4385e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner bool (*TestFn)(BugDriver &, Module *, Module *), 4395e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner std::vector<Function*> &MiscompiledFunctions) { 440f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner if (BugpointIsInterrupted) return false; 441f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner 4425e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner std::vector<BasicBlock*> Blocks; 4435e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner for (unsigned i = 0, e = MiscompiledFunctions.size(); i != e; ++i) 4445e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner for (Function::iterator I = MiscompiledFunctions[i]->begin(), 4455e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner E = MiscompiledFunctions[i]->end(); I != E; ++I) 4465e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner Blocks.push_back(I); 4475e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 4485e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Use the list reducer to identify blocks that can be extracted without 4495e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // obscuring the bug. The Blocks list will end up containing blocks that must 4505e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // be retained from the original program. 4515e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner unsigned OldSize = Blocks.size(); 45268bee938e539d884ee89ce4dfebbad777896960eChris Lattner 45368bee938e539d884ee89ce4dfebbad777896960eChris Lattner // Check to see if all blocks are extractible first. 45468bee938e539d884ee89ce4dfebbad777896960eChris Lattner if (ReduceMiscompiledBlocks(BD, TestFn, 45568bee938e539d884ee89ce4dfebbad777896960eChris Lattner MiscompiledFunctions).TestFuncs(std::vector<BasicBlock*>())) { 45668bee938e539d884ee89ce4dfebbad777896960eChris Lattner Blocks.clear(); 45768bee938e539d884ee89ce4dfebbad777896960eChris Lattner } else { 45868bee938e539d884ee89ce4dfebbad777896960eChris Lattner ReduceMiscompiledBlocks(BD, TestFn,MiscompiledFunctions).reduceList(Blocks); 45968bee938e539d884ee89ce4dfebbad777896960eChris Lattner if (Blocks.size() == OldSize) 46068bee938e539d884ee89ce4dfebbad777896960eChris Lattner return false; 46168bee938e539d884ee89ce4dfebbad777896960eChris Lattner } 4625e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 463d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman DenseMap<const Value*, Value*> ValueMap; 464d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman Module *ProgClone = CloneModule(BD.getProgram(), ValueMap); 4652290e754061f1393bb96b1808ac33dc03399c939Chris Lattner Module *ToExtract = SplitFunctionsOutOfModule(ProgClone, 466d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman MiscompiledFunctions, 467d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman ValueMap); 4682290e754061f1393bb96b1808ac33dc03399c939Chris Lattner Module *Extracted = BD.ExtractMappedBlocksFromModule(Blocks, ToExtract); 4692290e754061f1393bb96b1808ac33dc03399c939Chris Lattner if (Extracted == 0) { 470da895d63377b421dc50117befb2bec80d2973526Chris Lattner // Weird, extraction should have worked. 47165f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << "Nondeterministic problem extracting blocks??\n"; 4722290e754061f1393bb96b1808ac33dc03399c939Chris Lattner delete ProgClone; 4732290e754061f1393bb96b1808ac33dc03399c939Chris Lattner delete ToExtract; 4742290e754061f1393bb96b1808ac33dc03399c939Chris Lattner return false; 4752290e754061f1393bb96b1808ac33dc03399c939Chris Lattner } 4765e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 4772290e754061f1393bb96b1808ac33dc03399c939Chris Lattner // Otherwise, block extraction succeeded. Link the two program fragments back 4782290e754061f1393bb96b1808ac33dc03399c939Chris Lattner // together. 4792290e754061f1393bb96b1808ac33dc03399c939Chris Lattner delete ToExtract; 4805e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 48190c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner std::vector<std::pair<std::string, const FunctionType*> > MisCompFunctions; 48290c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner for (Module::iterator I = Extracted->begin(), E = Extracted->end(); 48390c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner I != E; ++I) 4845cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (!I->isDeclaration()) 485fa1af1344910ee975f50ffdddf605c26f80ef016Chris Lattner MisCompFunctions.push_back(std::make_pair(I->getName(), 486fa1af1344910ee975f50ffdddf605c26f80ef016Chris Lattner I->getFunctionType())); 48790c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner 4882290e754061f1393bb96b1808ac33dc03399c939Chris Lattner std::string ErrorMsg; 489e4874029c37c4b14d0646289f18e5f2a1b03fdc2Reid Spencer if (Linker::LinkModules(ProgClone, Extracted, &ErrorMsg)) { 49065f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << BD.getToolName() << ": Error linking modules together:" 49165f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << ErrorMsg << '\n'; 4922290e754061f1393bb96b1808ac33dc03399c939Chris Lattner exit(1); 4932290e754061f1393bb96b1808ac33dc03399c939Chris Lattner } 49490c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner delete Extracted; 4955e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 4962290e754061f1393bb96b1808ac33dc03399c939Chris Lattner // Set the new program and delete the old one. 4972290e754061f1393bb96b1808ac33dc03399c939Chris Lattner BD.setNewProgram(ProgClone); 4985e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 4992290e754061f1393bb96b1808ac33dc03399c939Chris Lattner // Update the list of miscompiled functions. 5002290e754061f1393bb96b1808ac33dc03399c939Chris Lattner MiscompiledFunctions.clear(); 5015e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 50290c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) { 503ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first); 50490c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner assert(NewF && "Function not found??"); 505ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer assert(NewF->getFunctionType() == MisCompFunctions[i].second && 506ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer "Function has wrong type??"); 50790c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner MiscompiledFunctions.push_back(NewF); 50890c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner } 5092290e754061f1393bb96b1808ac33dc03399c939Chris Lattner 5102290e754061f1393bb96b1808ac33dc03399c939Chris Lattner return true; 5115e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner} 5125e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 5135e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 514b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner/// DebugAMiscompilation - This is a generic driver to narrow down 515b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner/// miscompilations, either in an optimization or a code generator. 5168c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 517b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattnerstatic std::vector<Function*> 518b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris LattnerDebugAMiscompilation(BugDriver &BD, 519b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner bool (*TestFn)(BugDriver &, Module *, Module *)) { 520640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Okay, now that we have reduced the list of passes which are causing the 521640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // failure, see if we can pin down which functions are being 522640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // miscompiled... first build a list of all of the non-external functions in 523640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // the program. 524640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::vector<Function*> MiscompiledFunctions; 525b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner Module *Prog = BD.getProgram(); 526b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner for (Module::iterator I = Prog->begin(), E = Prog->end(); I != E; ++I) 5275cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (!I->isDeclaration()) 528640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner MiscompiledFunctions.push_back(I); 5294a10645c70199c8d8567fbc46312158c419720abChris Lattner 530640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Do the reduction... 531f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner if (!BugpointIsInterrupted) 532f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner ReduceMiscompilingFunctions(BD, TestFn).reduceList(MiscompiledFunctions); 533640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 534ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "\n*** The following function" 535ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << (MiscompiledFunctions.size() == 1 ? " is" : "s are") 536ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << " being miscompiled: "; 537640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner PrintFunctionList(MiscompiledFunctions); 538ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << '\n'; 5394a10645c70199c8d8567fbc46312158c419720abChris Lattner 540a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // See if we can rip any loops out of the miscompiled functions and still 541a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // trigger the problem. 542dc31a8a70cab3b4c180ac1a482855e31d3fe8e6bReid Spencer 5432803b4cc581af06bf99af5ddc3353836c63d1562Reid Spencer if (!BugpointIsInterrupted && !DisableLoopExtraction && 5442803b4cc581af06bf99af5ddc3353836c63d1562Reid Spencer ExtractLoops(BD, TestFn, MiscompiledFunctions)) { 545a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // Okay, we extracted some loops and the problem still appears. See if we 546a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // can eliminate some of the created functions from being candidates. 547a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner 54836ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner // Loop extraction can introduce functions with the same name (foo_code). 54936ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner // Make sure to disambiguate the symbols so that when the program is split 5505e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // apart that we can link it back together again. 5515e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner DisambiguateGlobalSymbols(BD.getProgram()); 5525e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 5535e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Do the reduction... 554f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner if (!BugpointIsInterrupted) 555f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner ReduceMiscompilingFunctions(BD, TestFn).reduceList(MiscompiledFunctions); 5563da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 557ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "\n*** The following function" 558ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << (MiscompiledFunctions.size() == 1 ? " is" : "s are") 559ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << " being miscompiled: "; 5605e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner PrintFunctionList(MiscompiledFunctions); 561ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << '\n'; 5625e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner } 5635e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 564265d82e4c68fa30b7ff1cb650456249f7068bdd6David Goodwin if (!BugpointIsInterrupted && !DisableBlockExtraction && 565aed98fa8861a28e5f7ba7c0659e106f2a441e9ffChris Lattner ExtractBlocks(BD, TestFn, MiscompiledFunctions)) { 5665e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Okay, we extracted some blocks and the problem still appears. See if we 5675e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // can eliminate some of the created functions from being candidates. 5685e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 5695e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Block extraction can introduce functions with the same name (foo_code). 5705e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Make sure to disambiguate the symbols so that when the program is split 57136ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner // apart that we can link it back together again. 57236ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner DisambiguateGlobalSymbols(BD.getProgram()); 57336ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner 574a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // Do the reduction... 575b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner ReduceMiscompilingFunctions(BD, TestFn).reduceList(MiscompiledFunctions); 5763da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 577ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "\n*** The following function" 578ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << (MiscompiledFunctions.size() == 1 ? " is" : "s are") 579ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << " being miscompiled: "; 580a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner PrintFunctionList(MiscompiledFunctions); 581ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << '\n'; 582a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner } 583a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner 584b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner return MiscompiledFunctions; 585b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner} 586b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner 587a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner/// TestOptimizer - This is the predicate function used to check to see if the 588a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner/// "Test" portion of the program is misoptimized. If so, return true. In any 589a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner/// case, both module arguments are deleted. 5908c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 591b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattnerstatic bool TestOptimizer(BugDriver &BD, Module *Test, Module *Safe) { 592b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner // Run the optimization passes on ToOptimize, producing a transformed version 593b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner // of the functions being tested. 594ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << " Optimizing functions being tested: "; 595b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner Module *Optimized = BD.runPassesOn(Test, BD.getPassesToRun(), 596b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner /*AutoDebugCrashes*/true); 597ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "done.\n"; 598b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner delete Test; 599b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner 600ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << " Checking to see if the merged program executes correctly: "; 6012423db0e8577e769ac5ad4e567808e43daf37945Chris Lattner bool Broken = TestMergedProgram(BD, Optimized, Safe, true); 602ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << (Broken ? " nope.\n" : " yup.\n"); 603b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner return Broken; 604b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner} 605b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner 606b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner 607b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner/// debugMiscompilation - This method is used when the passes selected are not 608b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner/// crashing, but the generated output is semantically different from the 609b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner/// input. 610b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner/// 611b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattnerbool BugDriver::debugMiscompilation() { 612b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner // Make sure something was miscompiled... 613f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner if (!BugpointIsInterrupted) 614f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner if (!ReduceMiscompilingPasses(*this).reduceList(PassesToRun)) { 61565f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << "*** Optimized program matches reference output! No problem" 61665f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << " detected...\nbugpoint can't help you with your problem!\n"; 617f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner return false; 618f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner } 619b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner 620ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "\n*** Found miscompiling pass" 621ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << (getPassesToRun().size() == 1 ? "" : "es") << ": " 622ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << getPassesString(getPassesToRun()) << '\n'; 6238ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif EmitProgressBitcode("passinput"); 624b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner 625b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner std::vector<Function*> MiscompiledFunctions = 626b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner DebugAMiscompilation(*this, TestOptimizer); 627b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner 6288ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif // Output a bunch of bitcode files for the user... 629ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "Outputting reduced bitcode files which expose the problem:\n"; 630d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman DenseMap<const Value*, Value*> ValueMap; 631d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman Module *ToNotOptimize = CloneModule(getProgram(), ValueMap); 632efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner Module *ToOptimize = SplitFunctionsOutOfModule(ToNotOptimize, 633d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman MiscompiledFunctions, 634d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman ValueMap); 635be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner 636ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << " Non-optimized portion: "; 637b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner ToNotOptimize = swapProgramIn(ToNotOptimize); 6388ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif EmitProgressBitcode("tonotoptimize", true); 639be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner setNewProgram(ToNotOptimize); // Delete hacked module. 6403da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 641ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << " Portion that is input to optimizer: "; 642b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner ToOptimize = swapProgramIn(ToOptimize); 6438ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif EmitProgressBitcode("tooptimize"); 644be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner setNewProgram(ToOptimize); // Delete hacked module. 6454a10645c70199c8d8567fbc46312158c419720abChris Lattner 6464a10645c70199c8d8567fbc46312158c419720abChris Lattner return false; 6474a10645c70199c8d8567fbc46312158c419720abChris Lattner} 648d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 649a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner/// CleanupAndPrepareModules - Get the specified modules ready for code 650a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner/// generator testing. 6518c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 652a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattnerstatic void CleanupAndPrepareModules(BugDriver &BD, Module *&Test, 653a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner Module *Safe) { 654a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Clean up the modules, removing extra cruft that we don't need anymore... 655a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner Test = BD.performFinalCleanups(Test); 656a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 657a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // If we are executing the JIT, we have several nasty issues to take care of. 658a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner if (!BD.isExecutingJIT()) return; 659a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 660a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // First, if the main function is in the Safe module, we must add a stub to 661a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // the Test module to call into it. Thus, we create a new function `main' 662a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // which just calls the old one. 663688b0490e22eb67623f5aaa24406209be74efcb2Reid Spencer if (Function *oldMain = Safe->getFunction("main")) 6645cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (!oldMain->isDeclaration()) { 665a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Rename it 666a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner oldMain->setName("llvm_bugpoint_old_main"); 667a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Create a NEW `main' function with same type in the test module. 668051a950000e21935165db56695e35bade668193bGabor Greif Function *newMain = Function::Create(oldMain->getFunctionType(), 669051a950000e21935165db56695e35bade668193bGabor Greif GlobalValue::ExternalLinkage, 670051a950000e21935165db56695e35bade668193bGabor Greif "main", Test); 671a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Create an `oldmain' prototype in the test module, which will 672a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // corresponds to the real main function in the same module. 673051a950000e21935165db56695e35bade668193bGabor Greif Function *oldMainProto = Function::Create(oldMain->getFunctionType(), 674051a950000e21935165db56695e35bade668193bGabor Greif GlobalValue::ExternalLinkage, 675051a950000e21935165db56695e35bade668193bGabor Greif oldMain->getName(), Test); 676a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Set up and remember the argument list for the main function. 677a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::vector<Value*> args; 6785a1c58d0094ff16dcd103f3752046d426ad5dd2cAlkis Evlogimenos for (Function::arg_iterator 6795a1c58d0094ff16dcd103f3752046d426ad5dd2cAlkis Evlogimenos I = newMain->arg_begin(), E = newMain->arg_end(), 6805a1c58d0094ff16dcd103f3752046d426ad5dd2cAlkis Evlogimenos OI = oldMain->arg_begin(); I != E; ++I, ++OI) { 6816bc41e8a74d1756da0003641bfebd02a3d6d9586Owen Anderson I->setName(OI->getName()); // Copy argument names from oldMain 682a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner args.push_back(I); 683a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 684a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 685a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Call the old main function and return its result 6861d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson BasicBlock *BB = BasicBlock::Create(Safe->getContext(), "entry", newMain); 687051a950000e21935165db56695e35bade668193bGabor Greif CallInst *call = CallInst::Create(oldMainProto, args.begin(), args.end(), 688051a950000e21935165db56695e35bade668193bGabor Greif "", BB); 6893da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 690a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // If the type of old function wasn't void, return value of call 6911d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson ReturnInst::Create(Safe->getContext(), call, BB); 692a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 693a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 694a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // The second nasty issue we must deal with in the JIT is that the Safe 695a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // module cannot directly reference any functions defined in the test 696a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // module. Instead, we use a JIT API call to dynamically resolve the 697a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // symbol. 6983da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 699a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Add the resolver to the Safe module. 700a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Prototype: void *getPointerToNamedFunction(const char* Name) 7012db43c864e8372823d961d961ca520ed20edca82Chris Lattner Constant *resolverFunc = 702a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner Safe->getOrInsertFunction("getPointerToNamedFunction", 7031d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson PointerType::getUnqual(Type::getInt8Ty(Safe->getContext())), 7041d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson PointerType::getUnqual(Type::getInt8Ty(Safe->getContext())), 7051d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson (Type *)0); 7063da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 707a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Use the function we just added to get addresses of functions we need. 708dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman for (Module::iterator F = Safe->begin(), E = Safe->end(); F != E; ++F) { 7095cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (F->isDeclaration() && !F->use_empty() && &*F != resolverFunc && 710a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands !F->isIntrinsic() /* ignore intrinsics */) { 711688b0490e22eb67623f5aaa24406209be74efcb2Reid Spencer Function *TestFn = Test->getFunction(F->getName()); 712a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 713a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Don't forward functions which are external in the test module too. 7145cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (TestFn && !TestFn->isDeclaration()) { 715a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // 1. Add a string constant with its name to the global file 7161d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson Constant *InitArray = ConstantArray::get(F->getContext(), F->getName()); 717a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner GlobalVariable *funcName = 718e9b11b431308f4766b73cda93e38ec930c912122Owen Anderson new GlobalVariable(*Safe, InitArray->getType(), true /*isConstant*/, 7193da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman GlobalValue::InternalLinkage, InitArray, 720e9b11b431308f4766b73cda93e38ec930c912122Owen Anderson F->getName() + "_name"); 721a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 722a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // 2. Use `GetElementPtr *funcName, 0, 0' to convert the string to an 723a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // sbyte* so it matches the signature of the resolver function. 724a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 725a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // GetElementPtr *funcName, ulong 0, ulong 0 7261d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson std::vector<Constant*> GEPargs(2, 7271d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson Constant::getNullValue(Type::getInt32Ty(F->getContext()))); 7289adc0abad3c3ed40a268ccbcee0c74cb9e1359feOwen Anderson Value *GEP = 729baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson ConstantExpr::getGetElementPtr(funcName, &GEPargs[0], 2); 730a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::vector<Value*> ResolverArgs; 731a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner ResolverArgs.push_back(GEP); 732a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 733de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman // Rewrite uses of F in global initializers, etc. to uses of a wrapper 734de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman // function that dynamically resolves the calls to F via our JIT API 735a3efca16f2688981672deeb718909cf6acbe474eChris Lattner if (!F->use_empty()) { 736a3efca16f2688981672deeb718909cf6acbe474eChris Lattner // Create a new global to hold the cached function pointer. 7379e9a0d5fc26878e51a58a8b57900fcbf952c2691Owen Anderson Constant *NullPtr = ConstantPointerNull::get(F->getType()); 738a3efca16f2688981672deeb718909cf6acbe474eChris Lattner GlobalVariable *Cache = 739e9b11b431308f4766b73cda93e38ec930c912122Owen Anderson new GlobalVariable(*F->getParent(), F->getType(), 740e9b11b431308f4766b73cda93e38ec930c912122Owen Anderson false, GlobalValue::InternalLinkage, 741e9b11b431308f4766b73cda93e38ec930c912122Owen Anderson NullPtr,F->getName()+".fpcache"); 74200b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 743de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman // Construct a new stub function that will re-route calls to F 744dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman const FunctionType *FuncTy = F->getFunctionType(); 745051a950000e21935165db56695e35bade668193bGabor Greif Function *FuncWrapper = Function::Create(FuncTy, 746051a950000e21935165db56695e35bade668193bGabor Greif GlobalValue::InternalLinkage, 747051a950000e21935165db56695e35bade668193bGabor Greif F->getName() + "_wrapper", 748051a950000e21935165db56695e35bade668193bGabor Greif F->getParent()); 7491d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson BasicBlock *EntryBB = BasicBlock::Create(F->getContext(), 7501d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson "entry", FuncWrapper); 7511d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson BasicBlock *DoCallBB = BasicBlock::Create(F->getContext(), 7521d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson "usecache", FuncWrapper); 7531d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson BasicBlock *LookupBB = BasicBlock::Create(F->getContext(), 7541d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson "lookupfp", FuncWrapper); 75500b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 756a3efca16f2688981672deeb718909cf6acbe474eChris Lattner // Check to see if we already looked up the value. 757a3efca16f2688981672deeb718909cf6acbe474eChris Lattner Value *CachedVal = new LoadInst(Cache, "fpcache", EntryBB); 758333c40096561218bc3597cf153c0a3895274414cOwen Anderson Value *IsNull = new ICmpInst(*EntryBB, ICmpInst::ICMP_EQ, CachedVal, 759333c40096561218bc3597cf153c0a3895274414cOwen Anderson NullPtr, "isNull"); 760051a950000e21935165db56695e35bade668193bGabor Greif BranchInst::Create(LookupBB, DoCallBB, IsNull, EntryBB); 76100b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 762de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman // Resolve the call to function F via the JIT API: 763de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman // 764de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman // call resolver(GetElementPtr...) 765b1dbcd886a4b5597a839f299054b78b33fb2d6dfGabor Greif CallInst *Resolver = 766b1dbcd886a4b5597a839f299054b78b33fb2d6dfGabor Greif CallInst::Create(resolverFunc, ResolverArgs.begin(), 767b1dbcd886a4b5597a839f299054b78b33fb2d6dfGabor Greif ResolverArgs.end(), "resolver", LookupBB); 768b1dbcd886a4b5597a839f299054b78b33fb2d6dfGabor Greif 769b1dbcd886a4b5597a839f299054b78b33fb2d6dfGabor Greif // Cast the result from the resolver to correctly-typed function. 770b1dbcd886a4b5597a839f299054b78b33fb2d6dfGabor Greif CastInst *CastedResolver = 771b1dbcd886a4b5597a839f299054b78b33fb2d6dfGabor Greif new BitCastInst(Resolver, 772debcb01b0f0a15f568ca69e8f288fade4bfc7297Owen Anderson PointerType::getUnqual(F->getFunctionType()), 773b1dbcd886a4b5597a839f299054b78b33fb2d6dfGabor Greif "resolverCast", LookupBB); 7743da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer 775a3efca16f2688981672deeb718909cf6acbe474eChris Lattner // Save the value in our cache. 776a3efca16f2688981672deeb718909cf6acbe474eChris Lattner new StoreInst(CastedResolver, Cache, LookupBB); 777051a950000e21935165db56695e35bade668193bGabor Greif BranchInst::Create(DoCallBB, LookupBB); 77800b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 779b1dbcd886a4b5597a839f299054b78b33fb2d6dfGabor Greif PHINode *FuncPtr = PHINode::Create(NullPtr->getType(), 780b1dbcd886a4b5597a839f299054b78b33fb2d6dfGabor Greif "fp", DoCallBB); 781a3efca16f2688981672deeb718909cf6acbe474eChris Lattner FuncPtr->addIncoming(CastedResolver, LookupBB); 782a3efca16f2688981672deeb718909cf6acbe474eChris Lattner FuncPtr->addIncoming(CachedVal, EntryBB); 78300b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 784a3efca16f2688981672deeb718909cf6acbe474eChris Lattner // Save the argument list. 785dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman std::vector<Value*> Args; 7865a1c58d0094ff16dcd103f3752046d426ad5dd2cAlkis Evlogimenos for (Function::arg_iterator i = FuncWrapper->arg_begin(), 7875a1c58d0094ff16dcd103f3752046d426ad5dd2cAlkis Evlogimenos e = FuncWrapper->arg_end(); i != e; ++i) 788dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman Args.push_back(i); 789dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman 790dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman // Pass on the arguments to the real function, return its result 7911d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson if (F->getReturnType() == Type::getVoidTy(F->getContext())) { 792051a950000e21935165db56695e35bade668193bGabor Greif CallInst::Create(FuncPtr, Args.begin(), Args.end(), "", DoCallBB); 7931d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson ReturnInst::Create(F->getContext(), DoCallBB); 794dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman } else { 795051a950000e21935165db56695e35bade668193bGabor Greif CallInst *Call = CallInst::Create(FuncPtr, Args.begin(), Args.end(), 796051a950000e21935165db56695e35bade668193bGabor Greif "retval", DoCallBB); 7971d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson ReturnInst::Create(F->getContext(),Call, DoCallBB); 798dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman } 79900b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 800de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman // Use the wrapper function instead of the old function 801de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman F->replaceAllUsesWith(FuncWrapper); 802dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman } 803a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 804a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 805a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 806a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 807a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner if (verifyModule(*Test) || verifyModule(*Safe)) { 80865f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << "Bugpoint has a bug, which corrupted a module!!\n"; 809a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner abort(); 810a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 811a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner} 812a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 813a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 814a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 815a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner/// TestCodeGenerator - This is the predicate function used to check to see if 816a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner/// the "Test" portion of the program is miscompiled by the code generator under 817a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner/// test. If so, return true. In any case, both module arguments are deleted. 8188c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 819a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattnerstatic bool TestCodeGenerator(BugDriver &BD, Module *Test, Module *Safe) { 820a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner CleanupAndPrepareModules(BD, Test, Safe); 821a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 82297182985d530dbef488696c95a39c14fe56c995bReid Spencer sys::Path TestModuleBC("bugpoint.test.bc"); 82351c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer std::string ErrMsg; 82451c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer if (TestModuleBC.makeUnique(true, &ErrMsg)) { 82565f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << BD.getToolName() << "Error making unique filename: " 82665f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << ErrMsg << "\n"; 82751c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer exit(1); 82851c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer } 82974382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner if (BD.writeProgramToFile(TestModuleBC.str(), Test)) { 83074382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner errs() << "Error writing bitcode to `" << TestModuleBC.str() 83174382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner << "'\nExiting."; 832a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner exit(1); 833a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 834a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner delete Test; 835a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 836a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Make the shared library 83797182985d530dbef488696c95a39c14fe56c995bReid Spencer sys::Path SafeModuleBC("bugpoint.safe.bc"); 83851c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer if (SafeModuleBC.makeUnique(true, &ErrMsg)) { 83965f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << BD.getToolName() << "Error making unique filename: " 84065f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << ErrMsg << "\n"; 84151c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer exit(1); 84251c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer } 843a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 84474382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner if (BD.writeProgramToFile(SafeModuleBC.str(), Safe)) { 84574382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner errs() << "Error writing bitcode to `" << SafeModuleBC.str() 84674382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner << "'\nExiting."; 847a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner exit(1); 848a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 84974382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner std::string SharedObject = BD.compileSharedObject(SafeModuleBC.str()); 850a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner delete Safe; 851a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 852a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Run the code generator on the `Test' code, loading the shared library. 853a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // The function returns whether or not the new output differs from reference. 85474382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner int Result = BD.diffProgram(TestModuleBC.str(), SharedObject, false); 855a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 856a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner if (Result) 85765f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << ": still failing!\n"; 858a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner else 85965f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << ": didn't fail.\n"; 860a229c5cce75209047db32c6039aa0b0fd481f049Reid Spencer TestModuleBC.eraseFromDisk(); 861a229c5cce75209047db32c6039aa0b0fd481f049Reid Spencer SafeModuleBC.eraseFromDisk(); 862a229c5cce75209047db32c6039aa0b0fd481f049Reid Spencer sys::Path(SharedObject).eraseFromDisk(); 863a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 864a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner return Result; 865a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner} 866a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 867a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 8688c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// debugCodeGenerator - debug errors in LLC, LLI, or CBE. 8698c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 870a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattnerbool BugDriver::debugCodeGenerator() { 87170ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman if ((void*)SafeInterpreter == (void*)Interpreter) { 87270ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman std::string Result = executeProgramSafely("bugpoint.safe.out"); 873ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "\n*** The \"safe\" i.e. 'known good' backend cannot match " 874ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << "the reference diff. This may be due to a\n front-end " 875ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << "bug or a bug in the original program, but this can also " 876ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << "happen if bugpoint isn't running the program with the " 877ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << "right flags or input.\n I left the result of executing " 878ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << "the program with the \"safe\" backend in this file for " 879ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << "you: '" 880ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << Result << "'.\n"; 881a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner return true; 882a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 883a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 884a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner DisambiguateGlobalSymbols(Program); 885a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 886a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::vector<Function*> Funcs = DebugAMiscompilation(*this, TestCodeGenerator); 887a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 888a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Split the module into the two halves of the program we want. 889d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman DenseMap<const Value*, Value*> ValueMap; 890d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman Module *ToNotCodeGen = CloneModule(getProgram(), ValueMap); 891d50330cd02b00c8e3de40e8544c45701b9891d87Dan Gohman Module *ToCodeGen = SplitFunctionsOutOfModule(ToNotCodeGen, Funcs, ValueMap); 892a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 893a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Condition the modules 894a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner CleanupAndPrepareModules(*this, ToCodeGen, ToNotCodeGen); 895a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 89697182985d530dbef488696c95a39c14fe56c995bReid Spencer sys::Path TestModuleBC("bugpoint.test.bc"); 89751c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer std::string ErrMsg; 89851c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer if (TestModuleBC.makeUnique(true, &ErrMsg)) { 89965f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << getToolName() << "Error making unique filename: " 90065f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << ErrMsg << "\n"; 90151c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer exit(1); 90251c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer } 90397182985d530dbef488696c95a39c14fe56c995bReid Spencer 90474382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner if (writeProgramToFile(TestModuleBC.str(), ToCodeGen)) { 90574382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner errs() << "Error writing bitcode to `" << TestModuleBC.str() 90674382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner << "'\nExiting."; 907a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner exit(1); 908a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 909a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner delete ToCodeGen; 910a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 911a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Make the shared library 91297182985d530dbef488696c95a39c14fe56c995bReid Spencer sys::Path SafeModuleBC("bugpoint.safe.bc"); 91351c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer if (SafeModuleBC.makeUnique(true, &ErrMsg)) { 91465f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << getToolName() << "Error making unique filename: " 91565f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << ErrMsg << "\n"; 91651c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer exit(1); 91751c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer } 91897182985d530dbef488696c95a39c14fe56c995bReid Spencer 91974382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner if (writeProgramToFile(SafeModuleBC.str(), ToNotCodeGen)) { 92074382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner errs() << "Error writing bitcode to `" << SafeModuleBC.str() 92174382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner << "'\nExiting."; 922a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner exit(1); 923a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 92474382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner std::string SharedObject = compileSharedObject(SafeModuleBC.str()); 925a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner delete ToNotCodeGen; 926a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 927ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "You can reproduce the problem with the command line: \n"; 928a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner if (isExecutingJIT()) { 92974382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner outs() << " lli -load " << SharedObject << " " << TestModuleBC.str(); 930a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } else { 93174382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner outs() << " llc -f " << TestModuleBC.str() << " -o " << TestModuleBC.str() 93274382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner << ".s\n"; 93374382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner outs() << " gcc " << SharedObject << " " << TestModuleBC.str() 93474382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner << ".s -o " << TestModuleBC.str() << ".exe"; 93559615f0f85e2ac99e012cb81934d002faebd405aChris Lattner#if defined (HAVE_LINK_R) 936ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << " -Wl,-R."; 93759615f0f85e2ac99e012cb81934d002faebd405aChris Lattner#endif 938ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "\n"; 93974382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner outs() << " " << TestModuleBC.str() << ".exe"; 940a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 941a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner for (unsigned i=0, e = InputArgv.size(); i != e; ++i) 942ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << " " << InputArgv[i]; 943ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << '\n'; 944ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman outs() << "The shared object was created with:\n llc -march=c " 94574382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner << SafeModuleBC.str() << " -o temporary.c\n" 946ca7409664273fed4b473127295af3af0836b3077Daniel Dunbar << " gcc -xc temporary.c -O2 -o " << SharedObject; 947ca7409664273fed4b473127295af3af0836b3077Daniel Dunbar if (TargetTriple.getArch() == Triple::sparc) 948ca7409664273fed4b473127295af3af0836b3077Daniel Dunbar outs() << " -G"; // Compile a shared library, `-G' for Sparc 949ca7409664273fed4b473127295af3af0836b3077Daniel Dunbar else 950ca7409664273fed4b473127295af3af0836b3077Daniel Dunbar outs() << " -fPIC -shared"; // `-shared' for Linux/X86, maybe others 951ca7409664273fed4b473127295af3af0836b3077Daniel Dunbar 952ca7409664273fed4b473127295af3af0836b3077Daniel Dunbar outs() << " -fno-strict-aliasing\n"; 953a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 954a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner return false; 955a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner} 956