From 4a9db7367dce5a5ad094f0667a7e1c19cb347635 Mon Sep 17 00:00:00 2001 From: Arthur Eubanks Date: Mon, 25 Oct 2021 10:52:30 -0700 Subject: [PATCH] [AlwaysInliner] Invalidate analyses when we delete functions Fixes PR52292. Reviewed By: asbirlea Differential Revision: https://reviews.llvm.org/D112473 --- llvm/lib/Transforms/IPO/AlwaysInliner.cpp | 8 ++++++-- llvm/test/Transforms/Inline/always-inline-invalidate.ll | 8 ++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 llvm/test/Transforms/Inline/always-inline-invalidate.ll diff --git a/llvm/lib/Transforms/IPO/AlwaysInliner.cpp b/llvm/lib/Transforms/IPO/AlwaysInliner.cpp index e7df2ce75704..01e724e22dcf 100644 --- a/llvm/lib/Transforms/IPO/AlwaysInliner.cpp +++ b/llvm/lib/Transforms/IPO/AlwaysInliner.cpp @@ -108,8 +108,10 @@ PreservedAnalyses AlwaysInlinerPass::run(Module &M, // Delete the non-comdat ones from the module and also from our vector. auto NonComdatBegin = partition( InlinedFunctions, [&](Function *F) { return F->hasComdat(); }); - for (Function *F : make_range(NonComdatBegin, InlinedFunctions.end())) + for (Function *F : make_range(NonComdatBegin, InlinedFunctions.end())) { M.getFunctionList().erase(F); + Changed = true; + } InlinedFunctions.erase(NonComdatBegin, InlinedFunctions.end()); if (!InlinedFunctions.empty()) { @@ -117,8 +119,10 @@ PreservedAnalyses AlwaysInlinerPass::run(Module &M, // are not actually dead. filterDeadComdatFunctions(M, InlinedFunctions); // The remaining functions are actually dead. - for (Function *F : InlinedFunctions) + for (Function *F : InlinedFunctions) { M.getFunctionList().erase(F); + Changed = true; + } } return Changed ? PreservedAnalyses::none() : PreservedAnalyses::all(); diff --git a/llvm/test/Transforms/Inline/always-inline-invalidate.ll b/llvm/test/Transforms/Inline/always-inline-invalidate.ll new file mode 100644 index 000000000000..781a8587f76b --- /dev/null +++ b/llvm/test/Transforms/Inline/always-inline-invalidate.ll @@ -0,0 +1,8 @@ +; RUN: opt -passes='require,always-inline' -disable-output < %s 2>&1 -debug-pass-manager | FileCheck %s + +; CHECK: Invalidating {{.*}} NoOpModuleAnalysis +; CHECK-NOT: @f + +define internal void @f() alwaysinline { + unreachable +}