From e54f58c7c5f13ecc3ef9302bbb05d95e857f7389 Mon Sep 17 00:00:00 2001 From: Keno Fischer Date: Sat, 5 Dec 2015 01:38:12 +0000 Subject: [PATCH] [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. llvm-svn: 254819 --- llvm/tools/opt/opt.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/llvm/tools/opt/opt.cpp b/llvm/tools/opt/opt.cpp index fc31beb48154..fe1605aa8436 100644 --- a/llvm/tools/opt/opt.cpp +++ b/llvm/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(); - // 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 + 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); + + // 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();