1ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//===-- TargetLibraryInfo.h - Library information ---------------*- C++ -*-===//
2ce99120084f549a523213064648662a704e8b789Chris Lattner//
3ce99120084f549a523213064648662a704e8b789Chris Lattner//                     The LLVM Compiler Infrastructure
4ce99120084f549a523213064648662a704e8b789Chris Lattner//
5ce99120084f549a523213064648662a704e8b789Chris Lattner// This file is distributed under the University of Illinois Open Source
6ce99120084f549a523213064648662a704e8b789Chris Lattner// License. See LICENSE.TXT for details.
7ce99120084f549a523213064648662a704e8b789Chris Lattner//
8ce99120084f549a523213064648662a704e8b789Chris Lattner//===----------------------------------------------------------------------===//
9ce99120084f549a523213064648662a704e8b789Chris Lattner
10ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#ifndef LLVM_ANALYSIS_TARGETLIBRARYINFO_H
11ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#define LLVM_ANALYSIS_TARGETLIBRARYINFO_H
12ce99120084f549a523213064648662a704e8b789Chris Lattner
139d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman#include "llvm/ADT/DenseMap.h"
144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/ADT/ArrayRef.h"
15ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/ADT/Optional.h"
16ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/ADT/Triple.h"
17ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/Function.h"
18ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/Module.h"
19255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Pass.h"
20ce99120084f549a523213064648662a704e8b789Chris Lattner
21f8e021ce4621688f8f57bf98302cba23f5d7e0f1Stephen Hines// BEGIN ANDROID-SPECIFIC
229bcf966b859ab099863dc5d60dbda84f326be0a8Elliott Hughes#ifdef _WIN32
23f8e021ce4621688f8f57bf98302cba23f5d7e0f1Stephen Hines#ifdef fseeko
24f8e021ce4621688f8f57bf98302cba23f5d7e0f1Stephen Hines#undef fseeko
25f8e021ce4621688f8f57bf98302cba23f5d7e0f1Stephen Hines#endif
26f8e021ce4621688f8f57bf98302cba23f5d7e0f1Stephen Hines#ifdef ftello
27f8e021ce4621688f8f57bf98302cba23f5d7e0f1Stephen Hines#undef ftello
28f8e021ce4621688f8f57bf98302cba23f5d7e0f1Stephen Hines#endif
299bcf966b859ab099863dc5d60dbda84f326be0a8Elliott Hughes#endif  // _WIN32
30f8e021ce4621688f8f57bf98302cba23f5d7e0f1Stephen Hines// END ANDROID-SPECIFIC
31f8e021ce4621688f8f57bf98302cba23f5d7e0f1Stephen Hines
32ce99120084f549a523213064648662a704e8b789Chris Lattnernamespace llvm {
334c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// VecDesc - Describes a possible vectorization of a function.
344c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// Function 'VectorFnName' is equivalent to 'ScalarFnName' vectorized
354c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// by a factor 'VectorizationFactor'.
364c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstruct VecDesc {
374c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  const char *ScalarFnName;
384c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  const char *VectorFnName;
394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  unsigned VectorizationFactor;
404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar};
41ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesclass PreservedAnalyses;
42ce99120084f549a523213064648662a704e8b789Chris Lattner
43ce99120084f549a523213064648662a704e8b789Chris Lattner  namespace LibFunc {
44ce99120084f549a523213064648662a704e8b789Chris Lattner    enum Func {
454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#define TLI_DEFINE_ENUM
464c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/Analysis/TargetLibraryInfo.def"
479d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman
48ce99120084f549a523213064648662a704e8b789Chris Lattner      NumLibFuncs
49ce99120084f549a523213064648662a704e8b789Chris Lattner    };
50ce99120084f549a523213064648662a704e8b789Chris Lattner  }
51ce99120084f549a523213064648662a704e8b789Chris Lattner
52ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief Implementation of the target library information.
53ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///
54ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// This class constructs tables that hold the target library information and
55ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// make it available. However, it is somewhat expensive to compute and only
56cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// depends on the triple. So users typically interact with the \c
57ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// TargetLibraryInfo wrapper below.
58ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesclass TargetLibraryInfoImpl {
59ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  friend class TargetLibraryInfo;
60ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
619d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  unsigned char AvailableArray[(LibFunc::NumLibFuncs+3)/4];
629d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  llvm::DenseMap<unsigned, std::string> CustomNames;
634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  static const char *const StandardNames[LibFunc::NumLibFuncs];
649d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman
659d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  enum AvailabilityState {
669d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    StandardName = 3, // (memset to all ones)
679d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    CustomName = 1,
689d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    Unavailable = 0  // (memset to all zeros)
699d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  };
709d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  void setState(LibFunc::Func F, AvailabilityState State) {
719d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    AvailableArray[F/4] &= ~(3 << 2*(F&3));
729d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    AvailableArray[F/4] |= State << 2*(F&3);
739d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  }
749d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  AvailabilityState getState(LibFunc::Func F) const {
759d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    return static_cast<AvailabilityState>((AvailableArray[F/4] >> 2*(F&3)) & 3);
769d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  }
779d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman
784c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// Vectorization descriptors - sorted by ScalarFnName.
794c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  std::vector<VecDesc> VectorDescs;
804c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// Scalarization descriptors - same content as VectorDescs but sorted based
814c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// on VectorFnName rather than ScalarFnName.
824c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  std::vector<VecDesc> ScalarDescs;
834c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
84ce99120084f549a523213064648662a704e8b789Chris Lattnerpublic:
854c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// \brief  List of known vector-functions libraries.
864c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  ///
874c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// The vector-functions library defines, which functions are vectorizable
884c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// and with which factor. The library can be specified by either frontend,
894c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// or a commandline option, and then used by
904c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// addVectorizableFunctionsFromVecLib for filling up the tables of
914c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// vectorizable functions.
924c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  enum VectorLibrary {
934c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    NoLibrary, // Don't use any vector library.
944c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    Accelerate // Use Accelerate framework.
954c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  };
964c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
97ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryInfoImpl();
98ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  explicit TargetLibraryInfoImpl(const Triple &T);
9937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
100ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Provide value semantics.
101ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryInfoImpl(const TargetLibraryInfoImpl &TLI);
102ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryInfoImpl(TargetLibraryInfoImpl &&TLI);
103ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryInfoImpl &operator=(const TargetLibraryInfoImpl &TLI);
104ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryInfoImpl &operator=(TargetLibraryInfoImpl &&TLI);
105ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
106ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// \brief Searches for a particular function name.
107ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  ///
108ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// If it is one of the known library functions, return true and set F to the
109ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// corresponding value.
110d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson  bool getLibFunc(StringRef funcName, LibFunc::Func &F) const;
111d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson
112ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// \brief Forces a function to be marked as unavailable.
113ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  void setUnavailable(LibFunc::Func F) {
114ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    setState(F, Unavailable);
115ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
116ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
117ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// \brief Forces a function to be marked as available.
118ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  void setAvailable(LibFunc::Func F) {
119ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    setState(F, StandardName);
120ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
121ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
122ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// \brief Forces a function to be marked as available and provide an
123ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// alternate name that must be used.
124ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  void setAvailableWithName(LibFunc::Func F, StringRef Name) {
125ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (StandardNames[F] != Name) {
126ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      setState(F, CustomName);
127ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      CustomNames[F] = Name;
128ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      assert(CustomNames.find(F) != CustomNames.end());
129ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    } else {
130ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      setState(F, StandardName);
131ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    }
132ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
133ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
134ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// \brief Disables all builtins.
135ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  ///
136ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// This can be used for options like -fno-builtin.
137ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  void disableAllFunctions();
1384c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// addVectorizableFunctions - Add a set of scalar -> vector mappings,
1404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// queryable via getVectorizedFunction and getScalarizedFunction.
1414c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void addVectorizableFunctions(ArrayRef<VecDesc> Fns);
1424c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1434c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// Calls addVectorizableFunctions with a known preset of functions for the
1444c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// given vector library.
1454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void addVectorizableFunctionsFromVecLib(enum VectorLibrary VecLib);
1464c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// isFunctionVectorizable - Return true if the function F has a
1484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// vector equivalent with vectorization factor VF.
1494c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool isFunctionVectorizable(StringRef F, unsigned VF) const {
1504c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return !getVectorizedFunction(F, VF).empty();
1514c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  }
1524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1534c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// isFunctionVectorizable - Return true if the function F has a
1544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// vector equivalent with any vectorization factor.
1554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool isFunctionVectorizable(StringRef F) const;
1564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1574c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// getVectorizedFunction - Return the name of the equivalent of
1584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// F, vectorized with factor VF. If no such mapping exists,
1594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// return the empty string.
1604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  StringRef getVectorizedFunction(StringRef F, unsigned VF) const;
1614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// isFunctionScalarizable - Return true if the function F has a
1634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// scalar equivalent, and set VF to be the vectorization factor.
1644c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool isFunctionScalarizable(StringRef F, unsigned &VF) const {
1654c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return !getScalarizedFunction(F, VF).empty();
1664c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  }
1674c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1684c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// getScalarizedFunction - Return the name of the equivalent of
1694c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// F, scalarized. If no such mapping exists, return the empty string.
1704c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  ///
1714c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// Set VF to the vectorization factor.
1724c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  StringRef getScalarizedFunction(StringRef F, unsigned &VF) const;
173ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines};
174ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
175ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief Provides information about what library functions are available for
176ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// the current target.
177ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///
178ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// This both allows optimizations to handle them specially and frontends to
179ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// disable such optimizations through -fno-builtin etc.
180ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesclass TargetLibraryInfo {
181ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  friend class TargetLibraryAnalysis;
182ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  friend class TargetLibraryInfoWrapperPass;
183ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
184ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  const TargetLibraryInfoImpl *Impl;
185ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
186ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinespublic:
187ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  explicit TargetLibraryInfo(const TargetLibraryInfoImpl &Impl) : Impl(&Impl) {}
188ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
189ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Provide value semantics.
190ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryInfo(const TargetLibraryInfo &TLI) : Impl(TLI.Impl) {}
191ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryInfo(TargetLibraryInfo &&TLI) : Impl(TLI.Impl) {}
192ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryInfo &operator=(const TargetLibraryInfo &TLI) {
193ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    Impl = TLI.Impl;
194ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return *this;
195ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
196ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryInfo &operator=(TargetLibraryInfo &&TLI) {
197ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    Impl = TLI.Impl;
198ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return *this;
199ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
200ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
201ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// \brief Searches for a particular function name.
202ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  ///
203ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// If it is one of the known library functions, return true and set F to the
204ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// corresponding value.
205ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  bool getLibFunc(StringRef funcName, LibFunc::Func &F) const {
206ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return Impl->getLibFunc(funcName, F);
207ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
208ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
2094c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// \brief Tests whether a library function is available.
210ce99120084f549a523213064648662a704e8b789Chris Lattner  bool has(LibFunc::Func F) const {
211ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return Impl->getState(F) != TargetLibraryInfoImpl::Unavailable;
2129d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  }
2134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool isFunctionVectorizable(StringRef F, unsigned VF) const {
2144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return Impl->isFunctionVectorizable(F, VF);
215cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  }
2164c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool isFunctionVectorizable(StringRef F) const {
2174c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return Impl->isFunctionVectorizable(F);
218cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  }
2194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  StringRef getVectorizedFunction(StringRef F, unsigned VF) const {
2204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return Impl->getVectorizedFunction(F, VF);
221cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  }
2229d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman
223ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// \brief Tests if the function is both available and a candidate for
224ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// optimized code generation.
225982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson  bool hasOptimizedCodeGen(LibFunc::Func F) const {
226ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (Impl->getState(F) == TargetLibraryInfoImpl::Unavailable)
227982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson      return false;
228982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson    switch (F) {
229982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson    default: break;
230982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson    case LibFunc::copysign:  case LibFunc::copysignf:  case LibFunc::copysignl:
231982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson    case LibFunc::fabs:      case LibFunc::fabsf:      case LibFunc::fabsl:
232982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson    case LibFunc::sin:       case LibFunc::sinf:       case LibFunc::sinl:
233982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson    case LibFunc::cos:       case LibFunc::cosf:       case LibFunc::cosl:
234982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson    case LibFunc::sqrt:      case LibFunc::sqrtf:      case LibFunc::sqrtl:
235b704d23062aa78b00999b75dcdcb628d4d84ee3fPreston Gurd    case LibFunc::sqrt_finite: case LibFunc::sqrtf_finite:
236b704d23062aa78b00999b75dcdcb628d4d84ee3fPreston Gurd                                                  case LibFunc::sqrtl_finite:
23736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case LibFunc::fmax:      case LibFunc::fmaxf:      case LibFunc::fmaxl:
23836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case LibFunc::fmin:      case LibFunc::fminf:      case LibFunc::fminl:
239982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson    case LibFunc::floor:     case LibFunc::floorf:     case LibFunc::floorl:
240982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson    case LibFunc::nearbyint: case LibFunc::nearbyintf: case LibFunc::nearbyintl:
241982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson    case LibFunc::ceil:      case LibFunc::ceilf:      case LibFunc::ceill:
242982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson    case LibFunc::rint:      case LibFunc::rintf:      case LibFunc::rintl:
24341418d17cced656f91038b2482bc9d173b4974b0Hal Finkel    case LibFunc::round:     case LibFunc::roundf:     case LibFunc::roundl:
244982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson    case LibFunc::trunc:     case LibFunc::truncf:     case LibFunc::truncl:
245982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson    case LibFunc::log2:      case LibFunc::log2f:      case LibFunc::log2l:
246982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson    case LibFunc::exp2:      case LibFunc::exp2f:      case LibFunc::exp2l:
2474fc7355a21e1fa838406e15459aaf54a58fcf909Richard Sandiford    case LibFunc::memcmp:    case LibFunc::strcmp:     case LibFunc::strcpy:
24819262ee0725a09b7c621a3d2eb66ba1513ae932aRichard Sandiford    case LibFunc::stpcpy:    case LibFunc::strlen:     case LibFunc::strnlen:
2498c20158fb0e1e5d747077f065eb0170c5af1fbfaRichard Sandiford    case LibFunc::memchr:
250982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson      return true;
251982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson    }
252982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson    return false;
253982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson  }
254982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson
2559d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  StringRef getName(LibFunc::Func F) const {
256ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    auto State = Impl->getState(F);
257ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (State == TargetLibraryInfoImpl::Unavailable)
2589d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman      return StringRef();
259ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (State == TargetLibraryInfoImpl::StandardName)
260ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return Impl->StandardNames[F];
261ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    assert(State == TargetLibraryInfoImpl::CustomName);
262ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return Impl->CustomNames.find(F)->second;
263ce99120084f549a523213064648662a704e8b789Chris Lattner  }
264ce99120084f549a523213064648662a704e8b789Chris Lattner
265ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// \brief Handle invalidation from the pass manager.
266ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  ///
267ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// If we try to invalidate this info, just return false. It cannot become
268ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// invalid even if the module changes.
269ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  bool invalidate(Module &, const PreservedAnalyses &) { return false; }
270ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines};
271ce99120084f549a523213064648662a704e8b789Chris Lattner
272ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief Analysis pass providing the \c TargetLibraryInfo.
273ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///
274ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// Note that this pass's result cannot be invalidated, it is immutable for the
275ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// life of the module.
276ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesclass TargetLibraryAnalysis {
277ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinespublic:
278ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  typedef TargetLibraryInfo Result;
2799d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman
280ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// \brief Opaque, unique identifier for this analysis pass.
281ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  static void *ID() { return (void *)&PassID; }
282ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
283ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// \brief Default construct the library analysis.
284ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  ///
285ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// This will use the module's triple to construct the library info for that
286ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// module.
287ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryAnalysis() {}
288ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
289ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// \brief Construct a library analysis with preset info.
290ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  ///
291ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// This will directly copy the preset info into the result without
292ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// consulting the module's triple.
293ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryAnalysis(TargetLibraryInfoImpl PresetInfoImpl)
294ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      : PresetInfoImpl(std::move(PresetInfoImpl)) {}
295ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
296ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Move semantics. We spell out the constructors for MSVC.
297ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryAnalysis(TargetLibraryAnalysis &&Arg)
298ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      : PresetInfoImpl(std::move(Arg.PresetInfoImpl)), Impls(std::move(Arg.Impls)) {}
299ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryAnalysis &operator=(TargetLibraryAnalysis &&RHS) {
300ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    PresetInfoImpl = std::move(RHS.PresetInfoImpl);
301ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    Impls = std::move(RHS.Impls);
302ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return *this;
3039d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  }
3049d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman
305ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryInfo run(Module &M);
306ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryInfo run(Function &F);
307ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
308ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// \brief Provide access to a name for this pass for debugging purposes.
309ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  static StringRef name() { return "TargetLibraryAnalysis"; }
310ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
311ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesprivate:
312ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  static char PassID;
313ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
314ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  Optional<TargetLibraryInfoImpl> PresetInfoImpl;
315ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
316ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  StringMap<std::unique_ptr<TargetLibraryInfoImpl>> Impls;
317ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
318ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryInfoImpl &lookupInfoImpl(Triple T);
319ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines};
320ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
321ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesclass TargetLibraryInfoWrapperPass : public ImmutablePass {
322ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryInfoImpl TLIImpl;
323ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryInfo TLI;
324ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
325ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  virtual void anchor();
326ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
327ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinespublic:
328ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  static char ID;
329ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryInfoWrapperPass();
330ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  explicit TargetLibraryInfoWrapperPass(const Triple &T);
331ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  explicit TargetLibraryInfoWrapperPass(const TargetLibraryInfoImpl &TLI);
332ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
333ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryInfo &getTLI() { return TLI; }
334ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  const TargetLibraryInfo &getTLI() const { return TLI; }
335ce99120084f549a523213064648662a704e8b789Chris Lattner};
336ce99120084f549a523213064648662a704e8b789Chris Lattner
337ce99120084f549a523213064648662a704e8b789Chris Lattner} // end namespace llvm
338ce99120084f549a523213064648662a704e8b789Chris Lattner
339ce99120084f549a523213064648662a704e8b789Chris Lattner#endif
340