Skip to content

Commit 58c3fba

Browse files
committed
Revert "LowerTypeTests: Fix quadratic complexity."
This reverts commit e4d951d. Need to investigate some test failures.
1 parent 3428cc9 commit 58c3fba

File tree

1 file changed

+83
-81
lines changed

1 file changed

+83
-81
lines changed

llvm/lib/Transforms/IPO/LowerTypeTests.cpp

Lines changed: 83 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1669,55 +1669,61 @@ void LowerTypeTestsModule::buildBitSetsFromFunctionsNative(
16691669

16701670
lowerTypeTestCalls(TypeIds, JumpTable, GlobalLayout);
16711671

1672-
// Build aliases pointing to offsets into the jump table, and replace
1673-
// references to the original functions with references to the aliases.
1674-
for (unsigned I = 0; I != Functions.size(); ++I) {
1675-
Function *F = cast<Function>(Functions[I]->getGlobal());
1676-
bool IsJumpTableCanonical = Functions[I]->isJumpTableCanonical();
1672+
{
1673+
ScopedSaveAliaseesAndUsed S(M);
16771674

1678-
Constant *CombinedGlobalElemPtr = ConstantExpr::getInBoundsGetElementPtr(
1679-
JumpTableType, JumpTable,
1680-
ArrayRef<Constant *>{ConstantInt::get(IntPtrTy, 0),
1681-
ConstantInt::get(IntPtrTy, I)});
1682-
1683-
const bool IsExported = Functions[I]->isExported();
1684-
if (!IsJumpTableCanonical) {
1685-
GlobalValue::LinkageTypes LT = IsExported ? GlobalValue::ExternalLinkage
1686-
: GlobalValue::InternalLinkage;
1687-
GlobalAlias *JtAlias = GlobalAlias::create(F->getValueType(), 0, LT,
1688-
F->getName() + ".cfi_jt",
1689-
CombinedGlobalElemPtr, &M);
1690-
if (IsExported)
1691-
JtAlias->setVisibility(GlobalValue::HiddenVisibility);
1692-
else
1693-
appendToUsed(M, {JtAlias});
1694-
}
1675+
// Build aliases pointing to offsets into the jump table, and replace
1676+
// references to the original functions with references to the aliases.
1677+
for (unsigned I = 0; I != Functions.size(); ++I) {
1678+
Function *F = cast<Function>(Functions[I]->getGlobal());
1679+
bool IsJumpTableCanonical = Functions[I]->isJumpTableCanonical();
1680+
1681+
Constant *CombinedGlobalElemPtr = ConstantExpr::getInBoundsGetElementPtr(
1682+
JumpTableType, JumpTable,
1683+
ArrayRef<Constant *>{ConstantInt::get(IntPtrTy, 0),
1684+
ConstantInt::get(IntPtrTy, I)});
1685+
1686+
const bool IsExported = Functions[I]->isExported();
1687+
if (!IsJumpTableCanonical) {
1688+
GlobalValue::LinkageTypes LT = IsExported
1689+
? GlobalValue::ExternalLinkage
1690+
: GlobalValue::InternalLinkage;
1691+
GlobalAlias *JtAlias = GlobalAlias::create(F->getValueType(), 0, LT,
1692+
F->getName() + ".cfi_jt",
1693+
CombinedGlobalElemPtr, &M);
1694+
if (IsExported)
1695+
JtAlias->setVisibility(GlobalValue::HiddenVisibility);
1696+
else
1697+
appendToUsed(M, {JtAlias});
1698+
}
16951699

1696-
if (IsExported) {
1697-
if (IsJumpTableCanonical)
1698-
ExportSummary->cfiFunctionDefs().emplace(F->getName());
1699-
else
1700-
ExportSummary->cfiFunctionDecls().emplace(F->getName());
1701-
}
1700+
if (IsExported) {
1701+
if (IsJumpTableCanonical)
1702+
ExportSummary->cfiFunctionDefs().emplace(F->getName());
1703+
else
1704+
ExportSummary->cfiFunctionDecls().emplace(F->getName());
1705+
}
17021706

1703-
if (!IsJumpTableCanonical) {
1704-
if (F->hasExternalWeakLinkage())
1705-
replaceWeakDeclarationWithJumpTablePtr(F, CombinedGlobalElemPtr,
1706-
IsJumpTableCanonical);
1707-
else
1708-
replaceCfiUses(F, CombinedGlobalElemPtr, IsJumpTableCanonical);
1709-
} else {
1710-
assert(F->getType()->getAddressSpace() == 0);
1711-
1712-
GlobalAlias *FAlias = GlobalAlias::create(
1713-
F->getValueType(), 0, F->getLinkage(), "", CombinedGlobalElemPtr, &M);
1714-
FAlias->setVisibility(F->getVisibility());
1715-
FAlias->takeName(F);
1716-
if (FAlias->hasName())
1717-
F->setName(FAlias->getName() + ".cfi");
1718-
replaceCfiUses(F, FAlias, IsJumpTableCanonical);
1719-
if (!F->hasLocalLinkage())
1720-
F->setVisibility(GlobalVariable::HiddenVisibility);
1707+
if (!IsJumpTableCanonical) {
1708+
if (F->hasExternalWeakLinkage())
1709+
replaceWeakDeclarationWithJumpTablePtr(F, CombinedGlobalElemPtr,
1710+
IsJumpTableCanonical);
1711+
else
1712+
replaceCfiUses(F, CombinedGlobalElemPtr, IsJumpTableCanonical);
1713+
} else {
1714+
assert(F->getType()->getAddressSpace() == 0);
1715+
1716+
GlobalAlias *FAlias =
1717+
GlobalAlias::create(F->getValueType(), 0, F->getLinkage(), "",
1718+
CombinedGlobalElemPtr, &M);
1719+
FAlias->setVisibility(F->getVisibility());
1720+
FAlias->takeName(F);
1721+
if (FAlias->hasName())
1722+
F->setName(FAlias->getName() + ".cfi");
1723+
replaceCfiUses(F, FAlias, IsJumpTableCanonical);
1724+
if (!F->hasLocalLinkage())
1725+
F->setVisibility(GlobalVariable::HiddenVisibility);
1726+
}
17211727
}
17221728
}
17231729

@@ -2333,43 +2339,39 @@ bool LowerTypeTestsModule::lower() {
23332339
if (GlobalClasses.empty())
23342340
return false;
23352341

2336-
{
2337-
ScopedSaveAliaseesAndUsed S(M);
2338-
// For each disjoint set we found...
2339-
for (const auto &C : GlobalClasses) {
2340-
if (!C->isLeader())
2341-
continue;
2342-
2343-
++NumTypeIdDisjointSets;
2344-
// Build the list of type identifiers in this disjoint set.
2345-
std::vector<Metadata *> TypeIds;
2346-
std::vector<GlobalTypeMember *> Globals;
2347-
std::vector<ICallBranchFunnel *> ICallBranchFunnels;
2348-
for (auto M : GlobalClasses.members(*C)) {
2349-
if (isa<Metadata *>(M))
2350-
TypeIds.push_back(cast<Metadata *>(M));
2351-
else if (isa<GlobalTypeMember *>(M))
2352-
Globals.push_back(cast<GlobalTypeMember *>(M));
2353-
else
2354-
ICallBranchFunnels.push_back(cast<ICallBranchFunnel *>(M));
2355-
}
2342+
// For each disjoint set we found...
2343+
for (const auto &C : GlobalClasses) {
2344+
if (!C->isLeader())
2345+
continue;
23562346

2357-
// Order type identifiers by unique ID for determinism. This ordering is
2358-
// stable as there is a one-to-one mapping between metadata and unique
2359-
// IDs.
2360-
llvm::sort(TypeIds, [&](Metadata *M1, Metadata *M2) {
2361-
return TypeIdInfo[M1].UniqueId < TypeIdInfo[M2].UniqueId;
2362-
});
2363-
2364-
// Same for the branch funnels.
2365-
llvm::sort(ICallBranchFunnels,
2366-
[&](ICallBranchFunnel *F1, ICallBranchFunnel *F2) {
2367-
return F1->UniqueId < F2->UniqueId;
2368-
});
2369-
2370-
// Build bitsets for this disjoint set.
2371-
buildBitSetsFromDisjointSet(TypeIds, Globals, ICallBranchFunnels);
2347+
++NumTypeIdDisjointSets;
2348+
// Build the list of type identifiers in this disjoint set.
2349+
std::vector<Metadata *> TypeIds;
2350+
std::vector<GlobalTypeMember *> Globals;
2351+
std::vector<ICallBranchFunnel *> ICallBranchFunnels;
2352+
for (auto M : GlobalClasses.members(*C)) {
2353+
if (isa<Metadata *>(M))
2354+
TypeIds.push_back(cast<Metadata *>(M));
2355+
else if (isa<GlobalTypeMember *>(M))
2356+
Globals.push_back(cast<GlobalTypeMember *>(M));
2357+
else
2358+
ICallBranchFunnels.push_back(cast<ICallBranchFunnel *>(M));
23722359
}
2360+
2361+
// Order type identifiers by unique ID for determinism. This ordering is
2362+
// stable as there is a one-to-one mapping between metadata and unique IDs.
2363+
llvm::sort(TypeIds, [&](Metadata *M1, Metadata *M2) {
2364+
return TypeIdInfo[M1].UniqueId < TypeIdInfo[M2].UniqueId;
2365+
});
2366+
2367+
// Same for the branch funnels.
2368+
llvm::sort(ICallBranchFunnels,
2369+
[&](ICallBranchFunnel *F1, ICallBranchFunnel *F2) {
2370+
return F1->UniqueId < F2->UniqueId;
2371+
});
2372+
2373+
// Build bitsets for this disjoint set.
2374+
buildBitSetsFromDisjointSet(TypeIds, Globals, ICallBranchFunnels);
23732375
}
23742376

23752377
allocateByteArrays();

0 commit comments

Comments
 (0)