[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.
|
// Before executing passes, print the final values of the LLVM options.
|
||||||
cl::PrintOptionValues();
|
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
|
// If requested, run all passes again with the same pass manager to catch
|
||||||
// bugs caused by persistent state in the passes
|
// bugs caused by persistent state in the passes
|
||||||
if (RunTwice) {
|
if (RunTwice) {
|
||||||
assert(Out);
|
|
||||||
CompileTwiceBuffer = Buffer;
|
|
||||||
Buffer.clear();
|
|
||||||
std::unique_ptr<Module> M2(CloneModule(M.get()));
|
std::unique_ptr<Module> M2(CloneModule(M.get()));
|
||||||
Passes.run(*M2);
|
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() ||
|
if (Buffer.size() != CompileTwiceBuffer.size() ||
|
||||||
(memcmp(Buffer.data(), CompileTwiceBuffer.data(), Buffer.size()) !=
|
(memcmp(Buffer.data(), CompileTwiceBuffer.data(), Buffer.size()) !=
|
||||||
0)) {
|
0)) {
|
||||||
errs() << "Running the pass manager twice changed the output.\n"
|
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"
|
"To generate the one-run comparison binary, just run without\n"
|
||||||
"the compile-twice option\n";
|
"the compile-twice option\n";
|
||||||
Out->os() << BOS->str();
|
Out->os() << BOS->str();
|
||||||
|
|
Loading…
Reference in New Issue