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