From 6953381b0c2e770c50bf41e13b5de9e567c992d5 Mon Sep 17 00:00:00 2001 From: Akira Hatanaka Date: Fri, 30 Jan 2015 01:16:24 +0000 Subject: [PATCH] [LTO] Scan all per-function subtargets when collecting runtime library names. accumulateAndSortLibcalls in LTOCodeGenerator.cpp collects names of runtime library functions which are used to identify user-defined functions that should be protected. Previously, this function would only scan the TargetLowering object belonging to the "main" subtarget for the library function names. This commit changes it to scan all per-function subtargets. Differential Revision: http://reviews.llvm.org/D7275 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@227533 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/LTO/LTOCodeGenerator.cpp | 34 +++++++++++++++++---------- test/LTO/runtime-library-subtarget.ll | 18 ++++++++++++++ 2 files changed, 40 insertions(+), 12 deletions(-) create mode 100644 test/LTO/runtime-library-subtarget.ll diff --git a/lib/LTO/LTOCodeGenerator.cpp b/lib/LTO/LTOCodeGenerator.cpp index d9375563755..3be805672d6 100644 --- a/lib/LTO/LTOCodeGenerator.cpp +++ b/lib/LTO/LTOCodeGenerator.cpp @@ -368,10 +368,13 @@ static void findUsedValues(GlobalVariable *LLVMUsed, UsedValues.insert(GV); } +// Collect names of runtime library functions. User-defined functions with the +// same names are added to llvm.compiler.used to prevent them from being +// deleted by optimizations. static void accumulateAndSortLibcalls(std::vector &Libcalls, const TargetLibraryInfo& TLI, - const TargetLowering *Lowering) -{ + const Module &Mod, + const TargetMachine &TM) { // TargetLibraryInfo has info on C runtime library calls on the current // target. for (unsigned I = 0, E = static_cast(LibFunc::NumLibFuncs); @@ -381,14 +384,21 @@ static void accumulateAndSortLibcalls(std::vector &Libcalls, Libcalls.push_back(TLI.getName(F)); } - // TargetLowering has info on library calls that CodeGen expects to be - // available, both from the C runtime and compiler-rt. - if (Lowering) - for (unsigned I = 0, E = static_cast(RTLIB::UNKNOWN_LIBCALL); - I != E; ++I) - if (const char *Name - = Lowering->getLibcallName(static_cast(I))) - Libcalls.push_back(Name); + SmallPtrSet TLSet; + + for (const Function &F : Mod) { + const TargetLowering *Lowering = + TM.getSubtargetImpl(F)->getTargetLowering(); + + if (Lowering && TLSet.insert(Lowering).second) + // TargetLowering has info on library calls that CodeGen expects to be + // available, both from the C runtime and compiler-rt. + for (unsigned I = 0, E = static_cast(RTLIB::UNKNOWN_LIBCALL); + I != E; ++I) + if (const char *Name = + Lowering->getLibcallName(static_cast(I))) + Libcalls.push_back(Name); + } array_pod_sort(Libcalls.begin(), Libcalls.end()); Libcalls.erase(std::unique(Libcalls.begin(), Libcalls.end()), @@ -412,8 +422,8 @@ void LTOCodeGenerator::applyScopeRestrictions() { std::vector Libcalls; TargetLibraryInfoImpl TLII(Triple(TargetMach->getTargetTriple())); TargetLibraryInfo TLI(TLII); - accumulateAndSortLibcalls( - Libcalls, TLI, TargetMach->getSubtargetImpl()->getTargetLowering()); + + accumulateAndSortLibcalls(Libcalls, TLI, *mergedModule, *TargetMach); for (Module::iterator f = mergedModule->begin(), e = mergedModule->end(); f != e; ++f) diff --git a/test/LTO/runtime-library-subtarget.ll b/test/LTO/runtime-library-subtarget.ll new file mode 100644 index 00000000000..aab1d90ea3b --- /dev/null +++ b/test/LTO/runtime-library-subtarget.ll @@ -0,0 +1,18 @@ +; Check that user-defined runtime library function __addsf3vfp is not removed +; +; RUN: llvm-as <%s >%t1 +; RUN: llvm-lto -o %t2 %t1 -mcpu arm1176jz-s +; RUN: llvm-nm %t2 | FileCheck %s + +target datalayout = "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" +target triple = "thumbv7-apple-ios" + +; CHECK: ___addsf3vfp + +define float @__addsf3vfp(float %a, float %b) #0 { +entry: + %add = fadd float %a, %b + ret float %add +} + +attributes #0 = { "target-cpu"="arm1176jzf-s"} -- 2.34.1