From 474f5efebed24547e76d022f0c5ffcc9db97ce6f Mon Sep 17 00:00:00 2001 From: Leonard Chan Date: Sun, 26 Mar 2023 01:38:08 +0000 Subject: 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. --- llvm/lib/Analysis/ModuleSummaryAnalysis.cpp | 37 ++++------------------------- 1 file changed, 4 insertions(+), 33 deletions(-) (limited to 'llvm/lib/Analysis/ModuleSummaryAnalysis.cpp') 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(I->getOperand(Op)), - StartingOffset + Offset, M, Index, VTableFuncs, OrigGV); + StartingOffset + Offset, M, Index, VTableFuncs); } } else if (auto *C = dyn_cast(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(I->getOperand(i)), - StartingOffset + i * EltSize, M, Index, VTableFuncs, - OrigGV); - } - } else if (const auto *CE = dyn_cast(I)) { - // For relative vtables, the next sub-component should be a trunc. - if (CE->getOpcode() != Instruction::Trunc || - !(CE = dyn_cast(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(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. -- cgit v1.1