From: Leonard Chan Date: Thu, 20 Jun 2019 19:44:51 +0000 (+0000) Subject: [clang][NewPM] Do not eliminate available_externally durng `-O2 -flto` runs X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0d6fe2eaa443182637f01e799a0b1cea96a77a4c;p=llvm [clang][NewPM] Do not eliminate available_externally durng `-O2 -flto` runs This fixes CodeGen/available-externally-suppress.c when the new pass manager is turned on by default. available_externally was not emitted during -O2 -flto runs when it should still be retained for link time inlining purposes. This can be fixed by checking that we aren't LTOPrelinking when adding the EliminateAvailableExternallyPass. Differential Revision: https://reviews.llvm.org/D63580 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@363971 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Passes/PassBuilder.cpp b/lib/Passes/PassBuilder.cpp index 2da923086b2..bd7ec65052a 100644 --- a/lib/Passes/PassBuilder.cpp +++ b/lib/Passes/PassBuilder.cpp @@ -812,8 +812,10 @@ ModulePassManager PassBuilder::buildModuleOptimizationPipeline( // available externally globals. Eventually they will be suppressed during // codegen, but eliminating here enables more opportunity for GlobalDCE as it // may make globals referenced by available external functions dead and saves - // running remaining passes on the eliminated functions. - MPM.addPass(EliminateAvailableExternallyPass()); + // running remaining passes on the eliminated functions. These should be + // preserved during prelinking for link-time inlining decisions. + if (!LTOPreLink) + MPM.addPass(EliminateAvailableExternallyPass()); if (EnableOrderFileInstrumentation) MPM.addPass(InstrOrderFilePass()); diff --git a/test/Other/available-externally-lto.ll b/test/Other/available-externally-lto.ll new file mode 100644 index 00000000000..e7f5e0e0ec2 --- /dev/null +++ b/test/Other/available-externally-lto.ll @@ -0,0 +1,23 @@ +; Ensure that we don't emit available_externally functions at -O2, unless +; -flto is present in which case we should preserve them for link-time inlining +; decisions. +; RUN: opt < %s -S -passes='default' | FileCheck %s +; RUN: opt < %s -S -passes='lto-pre-link' | FileCheck %s --check-prefix=LTO + +@x = common local_unnamed_addr global i32 0, align 4 + +define void @test() local_unnamed_addr #0 { +entry: + tail call void @f0(i32 17) + ret void +} + +; CHECK: declare void @f0(i32) +; LTO: define available_externally void @f0(i32 %y) +define available_externally void @f0(i32 %y) local_unnamed_addr #0 { +entry: + store i32 %y, i32* @x, align 4 + ret void +} + +attributes #0 = { noinline }