[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
This commit is contained in:
parent
a330293af7
commit
e54f58c7c5
|
@ -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) {
|
||||
assert(Out);
|
||||
CompileTwiceBuffer = Buffer;
|
||||
Buffer.clear();
|
||||
std::unique_ptr<Module> 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);
|
||||
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();
|
||||
|
|
Loading…
Reference in New Issue