diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index fb56a6f05d36..4845bd2957b3 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -437,6 +437,11 @@ static void addPGOInstrPasses(ModulePassManager &MPM, bool DebugLogging, MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(CGPipeline))); } + // Delete anything that is now dead to make sure that we don't instrument + // dead code. Instrumentation can end up keeping dead code around and + // dramatically increase code size. + MPM.addPass(GlobalDCEPass()); + if (RunProfileGen) { MPM.addPass(PGOInstrumentationGen()); diff --git a/llvm/test/Transforms/GlobalDCE/externally_available.ll b/llvm/test/Transforms/GlobalDCE/externally_available.ll index fca49b29ec8e..bc54db38cee0 100644 --- a/llvm/test/Transforms/GlobalDCE/externally_available.ll +++ b/llvm/test/Transforms/GlobalDCE/externally_available.ll @@ -1,12 +1,21 @@ ; RUN: opt < %s -globaldce -S | FileCheck %s +; test_global should not be emitted to the .s file. +; CHECK-NOT: @test_global = +@test_global = available_externally global i32 4 + +; test_global2 is a normal global using an available externally function. +; CHECK: @test_global2 = +@test_global2 = global i32 ()* @test_function2 + ; test_function should not be emitted to the .s file. -; CHECK-NOT: test_function +; CHECK-NOT: define {{.*}} @test_function() define available_externally i32 @test_function() { ret i32 4 } -; test_global should not be emitted to the .s file. -; CHECK-NOT: test_global -@test_global = available_externally global i32 4 - +; test_function2 isn't actually dead even though it's available externally. +; CHECK: define available_externally i32 @test_function2() +define available_externally i32 @test_function2() { + ret i32 4 +}