Fix PR4336: Iterating over use-def chains doesn't seem to be deterministic.

The problem was that BitcodeReader::materializeModule would read functions
from the bc file in densemap pointer key order (doubly non-deterministic!),
which would cause the use-def chains to be set up for globals in
non-determinstic order.  Non-determinstic use/def chains can cause 
nondeterminism in many places down-stream.

Many thanks to Julien Lerouge for putting together the pass in the PR that
shows the issue!


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73470 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-06-16 05:15:21 +00:00
parent fe7f294d5c
commit 714fa95d01

View File

@ -2040,14 +2040,13 @@ void BitcodeReader::dematerializeFunction(Function *F) {
Module *BitcodeReader::materializeModule(std::string *ErrInfo) { Module *BitcodeReader::materializeModule(std::string *ErrInfo) {
for (DenseMap<Function*, std::pair<uint64_t, unsigned> >::iterator I = // Iterate over the module, deserializing any functions that are still on
DeferredFunctionInfo.begin(), E = DeferredFunctionInfo.end(); I != E; // disk.
++I) { for (Module::iterator F = TheModule->begin(), E = TheModule->end();
Function *F = I->first; F != E; ++F)
if (F->hasNotBeenReadFromBitcode() && if (F->hasNotBeenReadFromBitcode() &&
materializeFunction(F, ErrInfo)) materializeFunction(F, ErrInfo))
return 0; return 0;
}
// Upgrade any intrinsic calls that slipped through (should not happen!) and // Upgrade any intrinsic calls that slipped through (should not happen!) and
// delete the old functions to clean up. We can't do this unless the entire // delete the old functions to clean up. We can't do this unless the entire
@ -2123,7 +2122,7 @@ Module *llvm::ParseBitcodeFile(MemoryBuffer *Buffer, std::string *ErrMsg){
// is run. // is run.
if (M) if (M)
M = R->releaseModule(ErrMsg); M = R->releaseModule(ErrMsg);
delete R; delete R;
return M; return M;
} }