[llvm] r222727 - Fix overly aggressive type merging.
Sean Silva
chisophugis at gmail.com
Wed Nov 26 13:39:00 PST 2014
I like this pattern of %p/foo.ll and %p/Inputs/foo.ll
Very tidy :)
-- Sean Silva
On Mon, Nov 24, 2014 at 9:59 PM, Rafael Espindola <
rafael.espindola at gmail.com> wrote:
> Author: rafael
> Date: Mon Nov 24 23:59:24 2014
> New Revision: 222727
>
> URL: http://llvm.org/viewvc/llvm-project?rev=222727&view=rev
> Log:
> Fix overly aggressive type merging.
>
> If we find out that two types are *not* isomorphic, we learn nothing about
> opaque sub types in both the source and destination.
>
> Added:
> llvm/trunk/test/Linker/Inputs/type-unique-opaque.ll
> llvm/trunk/test/Linker/type-unique-opaque.ll
> Modified:
> llvm/trunk/lib/Linker/LinkModules.cpp
>
> Modified: llvm/trunk/lib/Linker/LinkModules.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/LinkModules.cpp?rev=222727&r1=222726&r2=222727&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Linker/LinkModules.cpp (original)
> +++ llvm/trunk/lib/Linker/LinkModules.cpp Mon Nov 24 23:59:24 2014
> @@ -107,12 +107,23 @@ void TypeMapTy::addTypeMapping(Type *Dst
>
> // Check to see if these types are recursively isomorphic and establish
> a
> // mapping between them if so.
> - 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]);
> + if (areTypesIsomorphic(DstTy, SrcTy)) {
> + SpeculativeTypes.clear();
> + return;
> }
> +
> + // 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<StructType>(Iter->second);
> + if (DstTy && DstResolvedOpaqueTypes.erase(DstTy))
> + Removed++;
> + MappedTypes.erase(Iter);
> + }
> + SrcDefinitionsToResolve.resize(SrcDefinitionsToResolve.size() -
> Removed);
> SpeculativeTypes.clear();
> }
>
> @@ -147,14 +158,14 @@ bool TypeMapTy::areTypesIsomorphic(Type
>
> // 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. 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.
> + // 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.
> if (cast<StructType>(DstTy)->isOpaque()) {
> // We can only map one source type onto the opaque destination type.
> if (!DstResolvedOpaqueTypes.insert(cast<StructType>(DstTy)).second)
> return false;
> SrcDefinitionsToResolve.push_back(SSTy);
> + SpeculativeTypes.push_back(SrcTy);
> Entry = DstTy;
> return true;
> }
>
> Added: llvm/trunk/test/Linker/Inputs/type-unique-opaque.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/Inputs/type-unique-opaque.ll?rev=222727&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Linker/Inputs/type-unique-opaque.ll (added)
> +++ llvm/trunk/test/Linker/Inputs/type-unique-opaque.ll Mon Nov 24
> 23:59:24 2014
> @@ -0,0 +1,6 @@
> +%t = type { i8 }
> +%t2 = type { %t*, i16 }
> +
> +define %t2* @f() {
> + ret %t2* null
> +}
>
> Added: llvm/trunk/test/Linker/type-unique-opaque.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/type-unique-opaque.ll?rev=222727&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Linker/type-unique-opaque.ll (added)
> +++ llvm/trunk/test/Linker/type-unique-opaque.ll Mon Nov 24 23:59:24 2014
> @@ -0,0 +1,16 @@
> +; 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
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141126/e9c9ce50/attachment.html>
More information about the llvm-commits
mailing list