mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
Revert "Fix overly aggressive type merging."
This reverts commit r222727, which causes LTO bootstrap failures. Last passing @ r222698: http://lab.llvm.org:8080/green/job/clang-Rlto_master_build/532/ First failing @ r222843: http://lab.llvm.org:8080/green/job/clang-Rlto_master_build/533/ Internal bootstraps pointed at a much narrower range: r222725 is passing, and r222731 is failing. LTO crashes while handling libclang.dylib: http://lab.llvm.org:8080/green/job/clang-Rlto_master_build/533/consoleFull#-158682280549ba4694-19c4-4d7e-bec5-911270d8a58c GEP is not of right type for indices! %InfoObj.i.i = getelementptr inbounds %"class.llvm::OnDiskIterableChainedHashTable"* %.lcssa, i64 0, i32 0, i32 4, !dbg !123627 %"class.clang::serialization::reader::ASTIdentifierLookupTrait" = type { %"class.clang::ASTReader.31859"*, %"class.clang::serialization::ModuleFile.31870"*, %"class.clang::IdentifierInfo"* }LLVM ERROR: Broken function found, compilation aborted! clang: error: linker command failed with exit code 1 (use -v to see invocation) Looks like the new algorithm doesn't merge types aggressively enough. llvm-svn: 222895
This commit is contained in:
parent
b81721adb5
commit
bcb91dbf3f
@ -96,23 +96,12 @@ private:
|
|||||||
void TypeMapTy::addTypeMapping(Type *DstTy, Type *SrcTy) {
|
void TypeMapTy::addTypeMapping(Type *DstTy, Type *SrcTy) {
|
||||||
// Check to see if these types are recursively isomorphic and establish a
|
// Check to see if these types are recursively isomorphic and establish a
|
||||||
// mapping between them if so.
|
// mapping between them if so.
|
||||||
if (areTypesIsomorphic(DstTy, SrcTy)) {
|
if (!areTypesIsomorphic(DstTy, SrcTy)) {
|
||||||
SpeculativeTypes.clear();
|
// Oops, they aren't isomorphic. Just discard this request by rolling out
|
||||||
return;
|
// 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<StructType>(Iter->second);
|
|
||||||
if (DstTy && DstResolvedOpaqueTypes.erase(DstTy))
|
|
||||||
Removed++;
|
|
||||||
MappedTypes.erase(Iter);
|
|
||||||
}
|
|
||||||
SrcDefinitionsToResolve.resize(SrcDefinitionsToResolve.size() - Removed);
|
|
||||||
SpeculativeTypes.clear();
|
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
|
// 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
|
// 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
|
// the dest, but fill it in later. This doesn't need to be speculative. If
|
||||||
// that we're trying to map onto the same opaque type then we fail.
|
// 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()) {
|
if (cast<StructType>(DstTy)->isOpaque()) {
|
||||||
// We can only map one source type onto the opaque destination type.
|
// We can only map one source type onto the opaque destination type.
|
||||||
if (!DstResolvedOpaqueTypes.insert(cast<StructType>(DstTy)).second)
|
if (!DstResolvedOpaqueTypes.insert(cast<StructType>(DstTy)).second)
|
||||||
return false;
|
return false;
|
||||||
SrcDefinitionsToResolve.push_back(SSTy);
|
SrcDefinitionsToResolve.push_back(SSTy);
|
||||||
SpeculativeTypes.push_back(SrcTy);
|
|
||||||
Entry = DstTy;
|
Entry = DstTy;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
%t = type { i8 }
|
|
||||||
%t2 = type { %t*, i16 }
|
|
||||||
|
|
||||||
define %t2* @f() {
|
|
||||||
ret %t2* 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
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user