mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-23 14:25:07 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222727 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -107,12 +107,23 @@ 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)) {
|
||||
// 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 *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. 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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user