From: Keno Fischer Date: Sat, 5 Dec 2015 01:38:12 +0000 (+0000) Subject: [opt] Fix run-twice option for non-idempotent passes X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=3687382a3485127a701ef31dabed4a32cf231276;p=oota-llvm.git [opt] Fix run-twice option for non-idempotent passes Cloning the module was supposed to guard against the possibility that the passes may be non-idempotent. However, for some reason I decided to put that AFTER the passes had already run on the module, defeating the point entirely. Fix that by moving up the CloneModule as is done in llc. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254819 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index fc31beb4815..fe1605aa843 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -614,22 +614,26 @@ int main(int argc, char **argv) { // Before executing passes, print the final values of the LLVM options. cl::PrintOptionValues(); + // If requested, run all passes again with the same pass manager to catch + // bugs caused by persistent state in the passes + if (RunTwice) { + std::unique_ptr M2(CloneModule(M.get())); + Passes.run(*M2); + CompileTwiceBuffer = Buffer; + Buffer.clear(); + } + // Now that we have all of the passes ready, run them. Passes.run(*M); - // If requested, run all passes again with the same pass manager to catch - // bugs caused by persistent state in the passes + // Compare the two outputs and make sure they're the same if (RunTwice) { assert(Out); - CompileTwiceBuffer = Buffer; - Buffer.clear(); - std::unique_ptr M2(CloneModule(M.get())); - Passes.run(*M2); if (Buffer.size() != CompileTwiceBuffer.size() || (memcmp(Buffer.data(), CompileTwiceBuffer.data(), Buffer.size()) != 0)) { errs() << "Running the pass manager twice changed the output.\n" - "Writing the result of the second run to the specified output." + "Writing the result of the second run to the specified output.\n" "To generate the one-run comparison binary, just run without\n" "the compile-twice option\n"; Out->os() << BOS->str();