diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index 76daed250d3..f1f4a51f78c 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -96,23 +96,12 @@ private: void TypeMapTy::addTypeMapping(Type *DstTy, Type *SrcTy) { // Check to see if these types are recursively isomorphic and establish a // mapping between them if so. - if (areTypesIsomorphic(DstTy, SrcTy)) { - SpeculativeTypes.clear(); - return; + if (!areTypesIsomorphic(DstTy, SrcTy)) { + // Oops, they aren't isomorphic. Just discard this request by rolling out + // any speculative mappings we've established. + for (unsigned i = 0, e = SpeculativeTypes.size(); i != e; ++i) + MappedTypes.erase(SpeculativeTypes[i]); } - - // Oops, they aren't isomorphic. Just discard this request by rolling out - // any speculative mappings we've established. - unsigned Removed = 0; - for (unsigned I = 0, E = SpeculativeTypes.size(); I != E; ++I) { - Type *SrcTy = SpeculativeTypes[I]; - auto Iter = MappedTypes.find(SrcTy); - auto *DstTy = dyn_cast(Iter->second); - if (DstTy && DstResolvedOpaqueTypes.erase(DstTy)) - Removed++; - MappedTypes.erase(Iter); - } - SrcDefinitionsToResolve.resize(SrcDefinitionsToResolve.size() - Removed); SpeculativeTypes.clear(); } @@ -148,14 +137,14 @@ bool TypeMapTy::areTypesIsomorphic(Type *DstTy, Type *SrcTy) { // Mapping a non-opaque source type to an opaque dest. If this is the first // type that we're mapping onto this destination type then we succeed. Keep - // the dest, but fill it in later. If this is the second (different) type - // that we're trying to map onto the same opaque type then we fail. + // the dest, but fill it in later. This doesn't need to be speculative. If + // this is the second (different) type that we're trying to map onto the + // same opaque type then we fail. if (cast(DstTy)->isOpaque()) { // We can only map one source type onto the opaque destination type. if (!DstResolvedOpaqueTypes.insert(cast(DstTy)).second) return false; SrcDefinitionsToResolve.push_back(SSTy); - SpeculativeTypes.push_back(SrcTy); Entry = DstTy; return true; } diff --git a/test/Linker/Inputs/type-unique-opaque.ll b/test/Linker/Inputs/type-unique-opaque.ll deleted file mode 100644 index 872b601f691..00000000000 --- a/test/Linker/Inputs/type-unique-opaque.ll +++ /dev/null @@ -1,6 +0,0 @@ -%t = type { i8 } -%t2 = type { %t*, i16 } - -define %t2* @f() { - ret %t2* null -} diff --git a/test/Linker/type-unique-opaque.ll b/test/Linker/type-unique-opaque.ll deleted file mode 100644 index b4f69669921..00000000000 --- a/test/Linker/type-unique-opaque.ll +++ /dev/null @@ -1,16 +0,0 @@ -; RUN: llvm-link -S %s %p/Inputs/type-unique-opaque.ll | FileCheck %s - -; Test that a failed attempt at merging %u2 and %t2 (for the other file) will -; not cause %u and %t to get merged. - -; CHECK: %u = type opaque -; CHECK: define %u* @g() { - -%u = type opaque -%u2 = type { %u*, i8 } - -declare %u2* @f() - -define %u* @g() { - ret %u* null -}