diff options
author | Leonard Chan <leonardchan@google.com> | 2023-03-26 01:38:08 +0000 |
---|---|---|
committer | Leonard Chan <leonardchan@google.com> | 2023-03-26 01:53:13 +0000 |
commit | 474f5efebed24547e76d022f0c5ffcc9db97ce6f (patch) | |
tree | 634165e6722121dbe58449c87e3c2a4bf5436dbd /llvm/lib/Analysis/ModuleSummaryAnalysis.cpp | |
parent | bb4f6c4dca98a47054117708015bb2724256ee83 (diff) | |
download | llvm-474f5efebed24547e76d022f0c5ffcc9db97ce6f.zip llvm-474f5efebed24547e76d022f0c5ffcc9db97ce6f.tar.gz llvm-474f5efebed24547e76d022f0c5ffcc9db97ce6f.tar.bz2 |
Revert "[llvm] Teach whole program devirtualization about relative vtables"
This reverts commit db288184765c0b4010060ebea1f6de3ac1f66445.
Reverting since it broke our lto builders reported by fxbug.dev/123807.
Diffstat (limited to 'llvm/lib/Analysis/ModuleSummaryAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/ModuleSummaryAnalysis.cpp | 37 |
1 files changed, 4 insertions, 33 deletions
diff --git a/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp b/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp index 8f98158..26ff84f 100644 --- a/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp +++ b/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp @@ -22,7 +22,6 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Analysis/BlockFrequencyInfo.h" #include "llvm/Analysis/BranchProbabilityInfo.h" -#include "llvm/Analysis/ConstantFolding.h" #include "llvm/Analysis/IndirectCallPromotionAnalysis.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/MemoryProfileInfo.h" @@ -581,8 +580,7 @@ static void computeFunctionSummary( /// within the initializer. static void findFuncPointers(const Constant *I, uint64_t StartingOffset, const Module &M, ModuleSummaryIndex &Index, - VTableFuncList &VTableFuncs, - const GlobalVariable &OrigGV) { + VTableFuncList &VTableFuncs) { // First check if this is a function pointer. if (I->getType()->isPointerTy()) { auto C = I->stripPointerCasts(); @@ -610,7 +608,7 @@ static void findFuncPointers(const Constant *I, uint64_t StartingOffset, auto Offset = SL->getElementOffset(EI.index()); unsigned Op = SL->getElementContainingOffset(Offset); findFuncPointers(cast<Constant>(I->getOperand(Op)), - StartingOffset + Offset, M, Index, VTableFuncs, OrigGV); + StartingOffset + Offset, M, Index, VTableFuncs); } } else if (auto *C = dyn_cast<ConstantArray>(I)) { ArrayType *ATy = C->getType(); @@ -618,34 +616,7 @@ static void findFuncPointers(const Constant *I, uint64_t StartingOffset, uint64_t EltSize = DL.getTypeAllocSize(EltTy); for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) { findFuncPointers(cast<Constant>(I->getOperand(i)), - StartingOffset + i * EltSize, M, Index, VTableFuncs, - OrigGV); - } - } else if (const auto *CE = dyn_cast<ConstantExpr>(I)) { - // For relative vtables, the next sub-component should be a trunc. - if (CE->getOpcode() != Instruction::Trunc || - !(CE = dyn_cast<ConstantExpr>(CE->getOperand(0)))) - return; - - // If this constant can be reduced to the offset between a function and a - // global, then we know this is a valid virtual function if the RHS is the - // original vtable we're scanning through. - if (CE->getOpcode() == Instruction::Sub) { - GlobalValue *LHS, *RHS; - APSInt LHSOffset, RHSOffset; - if (IsConstantOffsetFromGlobal(CE->getOperand(0), LHS, LHSOffset, DL) && - IsConstantOffsetFromGlobal(CE->getOperand(1), RHS, RHSOffset, DL) && - RHS == &OrigGV && - - // For relative vtables, this component should point to the callable - // function without any offsets. - LHSOffset == 0 && - - // Also, the RHS should always point to somewhere within the vtable. - RHSOffset <= - static_cast<uint64_t>(DL.getTypeAllocSize(OrigGV.getInitializer()->getType()))) { - findFuncPointers(LHS, StartingOffset, M, Index, VTableFuncs, OrigGV); - } + StartingOffset + i * EltSize, M, Index, VTableFuncs); } } } @@ -658,7 +629,7 @@ static void computeVTableFuncs(ModuleSummaryIndex &Index, return; findFuncPointers(V.getInitializer(), /*StartingOffset=*/0, M, Index, - VTableFuncs, V); + VTableFuncs); #ifndef NDEBUG // Validate that the VTableFuncs list is ordered by offset. |