<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 26, 2015 at 10:21 AM, Ahmed Bougacha <span dir="ltr"><<a href="mailto:ahmed.bougacha@gmail.com" target="_blank">ahmed.bougacha@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi David, Ashutosh,<br>
<br>
Should VectorUtils be in Analysis instead?  Seems like it doesn't<br>
transform anything, and I'm having (shared) link failures on OS X:<br>
<br>
Undefined symbols for architecture x86_64:<br>
  "llvm::getIntrinsicIDForCall(llvm::CallInst*,<br>
llvm::TargetLibraryInfo const*)", referenced from:<br>
      llvm::LoopAccessInfo::analyzeLoop(llvm::DenseMap<llvm::Value<br>
const*, llvm::Value*, llvm::DenseMapInfo<llvm::Value const*>,<br>
llvm::detail::DenseMapPair<llvm::Value const*, llvm::Value*> > const&)<br>
in LoopAccessAnalysis.cpp.o<br>
ld: symbol(s) not found for architecture x86_64<br>
<br>
Per the various LLVMBuild.txts, TransformUtils already depends on<br>
Analysis, so having Analysis depend on TransformUtils won't fly<br>
(llvm-build complains about cycles).<br></blockquote><div><br>Yeah, saw this turn up on at least one bot. I'll have a go at moving it... <br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<span class="HOEnZb"><font color="#888888"><br>
-Ahmed<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
On Fri, Jun 26, 2015 at 9:57 AM, David Blaikie <<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>> wrote:<br>
> Author: dblaikie<br>
> Date: Fri Jun 26 11:57:30 2015<br>
> New Revision: 240794<br>
><br>
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D240794-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=uGXSNYYXV9mzaj-p2pNAJL8Kl4Cy02ATyYFBZMW7JOo&s=UjQ9eAANgNka05L1AcyrsIXfiVn0hoSPICw5XJGht5s&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=240794&view=rev</a><br>
> Log:<br>
> Fix ODR violation waiting to happen by making static function definitions in VectorUtils.h non-static and defined out of line<br>
><br>
> Patch by Ashutosh Nema<br>
><br>
> Differential Revision: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D10682&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=uGXSNYYXV9mzaj-p2pNAJL8Kl4Cy02ATyYFBZMW7JOo&s=59pUfHWVuJc6BwGHSRnLHT1LNKdPMnKh17enNRLDo3w&e=" rel="noreferrer" target="_blank">http://reviews.llvm.org/D10682</a><br>
><br>
> Added:<br>
>     llvm/trunk/lib/Transforms/Utils/VectorUtils.cpp<br>
>       - copied, changed from r240790, llvm/trunk/include/llvm/Transforms/Utils/VectorUtils.h<br>
> Modified:<br>
>     llvm/trunk/include/llvm/Transforms/Utils/VectorUtils.h<br>
>     llvm/trunk/lib/Transforms/Utils/CMakeLists.txt<br>
><br>
> Modified: llvm/trunk/include/llvm/Transforms/Utils/VectorUtils.h<br>
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_Transforms_Utils_VectorUtils.h-3Frev-3D240794-26r1-3D240793-26r2-3D240794-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=uGXSNYYXV9mzaj-p2pNAJL8Kl4Cy02ATyYFBZMW7JOo&s=tLHWdkAo-1pIgDPdFSqmRAXTKxZd8oKgjwtoxBnBB-I&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/VectorUtils.h?rev=240794&r1=240793&r2=240794&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/include/llvm/Transforms/Utils/VectorUtils.h (original)<br>
> +++ llvm/trunk/include/llvm/Transforms/Utils/VectorUtils.h Fri Jun 26 11:57:30 2015<br>
> @@ -21,184 +21,35 @@<br>
>  namespace llvm {<br>
><br>
>  /// \brief Identify if the intrinsic is trivially vectorizable.<br>
> -///<br>
>  /// This method returns true if the intrinsic's argument types are all<br>
>  /// scalars for the scalar form of the intrinsic and all vectors for<br>
>  /// the vector form of the intrinsic.<br>
> -static inline bool isTriviallyVectorizable(Intrinsic::ID ID) {<br>
> -  switch (ID) {<br>
> -  case Intrinsic::sqrt:<br>
> -  case Intrinsic::sin:<br>
> -  case Intrinsic::cos:<br>
> -  case Intrinsic::exp:<br>
> -  case Intrinsic::exp2:<br>
> -  case Intrinsic::log:<br>
> -  case Intrinsic::log10:<br>
> -  case Intrinsic::log2:<br>
> -  case Intrinsic::fabs:<br>
> -  case Intrinsic::minnum:<br>
> -  case Intrinsic::maxnum:<br>
> -  case Intrinsic::copysign:<br>
> -  case Intrinsic::floor:<br>
> -  case Intrinsic::ceil:<br>
> -  case Intrinsic::trunc:<br>
> -  case Intrinsic::rint:<br>
> -  case Intrinsic::nearbyint:<br>
> -  case Intrinsic::round:<br>
> -  case Intrinsic::bswap:<br>
> -  case Intrinsic::ctpop:<br>
> -  case Intrinsic::pow:<br>
> -  case Intrinsic::fma:<br>
> -  case Intrinsic::fmuladd:<br>
> -  case Intrinsic::ctlz:<br>
> -  case Intrinsic::cttz:<br>
> -  case Intrinsic::powi:<br>
> -    return true;<br>
> -  default:<br>
> -    return false;<br>
> -  }<br>
> -}<br>
> -<br>
> -static inline bool hasVectorInstrinsicScalarOpd(Intrinsic::ID ID,<br>
> -                                         unsigned ScalarOpdIdx) {<br>
> -  switch (ID) {<br>
> -    case Intrinsic::ctlz:<br>
> -    case Intrinsic::cttz:<br>
> -    case Intrinsic::powi:<br>
> -      return (ScalarOpdIdx == 1);<br>
> -    default:<br>
> -      return false;<br>
> -  }<br>
> -}<br>
> -<br>
> -static Intrinsic::ID checkUnaryFloatSignature(const CallInst &I,<br>
> -                                              Intrinsic::ID ValidIntrinsicID) {<br>
> -  if (I.getNumArgOperands() != 1 ||<br>
> -      !I.getArgOperand(0)->getType()->isFloatingPointTy() ||<br>
> -      I.getType() != I.getArgOperand(0)->getType() ||<br>
> -      !I.onlyReadsMemory())<br>
> -    return Intrinsic::not_intrinsic;<br>
> -<br>
> -  return ValidIntrinsicID;<br>
> -}<br>
> -<br>
> -static Intrinsic::ID checkBinaryFloatSignature(const CallInst &I,<br>
> -                                               Intrinsic::ID ValidIntrinsicID) {<br>
> -  if (I.getNumArgOperands() != 2 ||<br>
> -      !I.getArgOperand(0)->getType()->isFloatingPointTy() ||<br>
> -      !I.getArgOperand(1)->getType()->isFloatingPointTy() ||<br>
> -      I.getType() != I.getArgOperand(0)->getType() ||<br>
> -      I.getType() != I.getArgOperand(1)->getType() ||<br>
> -      !I.onlyReadsMemory())<br>
> -    return Intrinsic::not_intrinsic;<br>
> -<br>
> -  return ValidIntrinsicID;<br>
> -}<br>
> -<br>
> -static Intrinsic::ID<br>
> -getIntrinsicIDForCall(CallInst *CI, const TargetLibraryInfo *TLI) {<br>
> -  // If we have an intrinsic call, check if it is trivially vectorizable.<br>
> -  if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI)) {<br>
> -    Intrinsic::ID ID = II->getIntrinsicID();<br>
> -    if (isTriviallyVectorizable(ID) || ID == Intrinsic::lifetime_start ||<br>
> -        ID == Intrinsic::lifetime_end || ID == Intrinsic::assume)<br>
> -      return ID;<br>
> -    else<br>
> -      return Intrinsic::not_intrinsic;<br>
> -  }<br>
> -<br>
> -  if (!TLI)<br>
> -    return Intrinsic::not_intrinsic;<br>
> -<br>
> -  LibFunc::Func Func;<br>
> -  Function *F = CI->getCalledFunction();<br>
> -  // We're going to make assumptions on the semantics of the functions, check<br>
> -  // that the target knows that it's available in this environment and it does<br>
> -  // not have local linkage.<br>
> -  if (!F || F->hasLocalLinkage() || !TLI->getLibFunc(F->getName(), Func))<br>
> -    return Intrinsic::not_intrinsic;<br>
> -<br>
> -  // Otherwise check if we have a call to a function that can be turned into a<br>
> -  // vector intrinsic.<br>
> -  switch (Func) {<br>
> -  default:<br>
> -    break;<br>
> -  case LibFunc::sin:<br>
> -  case LibFunc::sinf:<br>
> -  case LibFunc::sinl:<br>
> -    return checkUnaryFloatSignature(*CI, Intrinsic::sin);<br>
> -  case LibFunc::cos:<br>
> -  case LibFunc::cosf:<br>
> -  case LibFunc::cosl:<br>
> -    return checkUnaryFloatSignature(*CI, Intrinsic::cos);<br>
> -  case LibFunc::exp:<br>
> -  case LibFunc::expf:<br>
> -  case LibFunc::expl:<br>
> -    return checkUnaryFloatSignature(*CI, Intrinsic::exp);<br>
> -  case LibFunc::exp2:<br>
> -  case LibFunc::exp2f:<br>
> -  case LibFunc::exp2l:<br>
> -    return checkUnaryFloatSignature(*CI, Intrinsic::exp2);<br>
> -  case LibFunc::log:<br>
> -  case LibFunc::logf:<br>
> -  case LibFunc::logl:<br>
> -    return checkUnaryFloatSignature(*CI, Intrinsic::log);<br>
> -  case LibFunc::log10:<br>
> -  case LibFunc::log10f:<br>
> -  case LibFunc::log10l:<br>
> -    return checkUnaryFloatSignature(*CI, Intrinsic::log10);<br>
> -  case LibFunc::log2:<br>
> -  case LibFunc::log2f:<br>
> -  case LibFunc::log2l:<br>
> -    return checkUnaryFloatSignature(*CI, Intrinsic::log2);<br>
> -  case LibFunc::fabs:<br>
> -  case LibFunc::fabsf:<br>
> -  case LibFunc::fabsl:<br>
> -    return checkUnaryFloatSignature(*CI, Intrinsic::fabs);<br>
> -  case LibFunc::fmin:<br>
> -  case LibFunc::fminf:<br>
> -  case LibFunc::fminl:<br>
> -    return checkBinaryFloatSignature(*CI, Intrinsic::minnum);<br>
> -  case LibFunc::fmax:<br>
> -  case LibFunc::fmaxf:<br>
> -  case LibFunc::fmaxl:<br>
> -    return checkBinaryFloatSignature(*CI, Intrinsic::maxnum);<br>
> -  case LibFunc::copysign:<br>
> -  case LibFunc::copysignf:<br>
> -  case LibFunc::copysignl:<br>
> -    return checkBinaryFloatSignature(*CI, Intrinsic::copysign);<br>
> -  case LibFunc::floor:<br>
> -  case LibFunc::floorf:<br>
> -  case LibFunc::floorl:<br>
> -    return checkUnaryFloatSignature(*CI, Intrinsic::floor);<br>
> -  case LibFunc::ceil:<br>
> -  case LibFunc::ceilf:<br>
> -  case LibFunc::ceill:<br>
> -    return checkUnaryFloatSignature(*CI, Intrinsic::ceil);<br>
> -  case LibFunc::trunc:<br>
> -  case LibFunc::truncf:<br>
> -  case LibFunc::truncl:<br>
> -    return checkUnaryFloatSignature(*CI, Intrinsic::trunc);<br>
> -  case LibFunc::rint:<br>
> -  case LibFunc::rintf:<br>
> -  case LibFunc::rintl:<br>
> -    return checkUnaryFloatSignature(*CI, Intrinsic::rint);<br>
> -  case LibFunc::nearbyint:<br>
> -  case LibFunc::nearbyintf:<br>
> -  case LibFunc::nearbyintl:<br>
> -    return checkUnaryFloatSignature(*CI, Intrinsic::nearbyint);<br>
> -  case LibFunc::round:<br>
> -  case LibFunc::roundf:<br>
> -  case LibFunc::roundl:<br>
> -    return checkUnaryFloatSignature(*CI, Intrinsic::round);<br>
> -  case LibFunc::pow:<br>
> -  case LibFunc::powf:<br>
> -  case LibFunc::powl:<br>
> -    return checkBinaryFloatSignature(*CI, Intrinsic::pow);<br>
> -  }<br>
> +bool isTriviallyVectorizable(Intrinsic::ID ID);<br>
><br>
> -  return Intrinsic::not_intrinsic;<br>
> -}<br>
> +/// \brief Identifies if the intrinsic has a scalar operand. It checks for<br>
> +/// ctlz,cttz and powi special intrinsics whose argument is scalar.<br>
> +bool hasVectorInstrinsicScalarOpd(Intrinsic::ID ID, unsigned ScalarOpdIdx);<br>
> +<br>
> +/// \brief Identify if call has a unary float signature<br>
> +/// It returns input intrinsic ID if call has a single argument,<br>
> +/// argument type and call instruction type should be floating<br>
> +/// point type and call should only reads memory.<br>
> +/// else return not_intrinsic.<br>
> +Intrinsic::ID checkUnaryFloatSignature(const CallInst &I,<br>
> +                                       Intrinsic::ID ValidIntrinsicID);<br>
> +<br>
> +/// \brief Identify if call has a binary float signature<br>
> +/// It returns input intrinsic ID if call has two arguments,<br>
> +/// arguments type and call instruction type should be floating<br>
> +/// point type and call should only reads memory.<br>
> +/// else return not_intrinsic.<br>
> +Intrinsic::ID checkBinaryFloatSignature(const CallInst &I,<br>
> +                                        Intrinsic::ID ValidIntrinsicID);<br>
> +<br>
> +/// \brief Returns intrinsic ID for call.<br>
> +/// For the input call instruction it finds mapping intrinsic and returns<br>
> +/// its intrinsic ID, in case it does not found it return not_intrinsic.<br>
> +Intrinsic::ID getIntrinsicIDForCall(CallInst *CI, const TargetLibraryInfo *TLI);<br>
><br>
>  } // llvm namespace<br>
><br>
><br>
> Modified: llvm/trunk/lib/Transforms/Utils/CMakeLists.txt<br>
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Transforms_Utils_CMakeLists.txt-3Frev-3D240794-26r1-3D240793-26r2-3D240794-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=uGXSNYYXV9mzaj-p2pNAJL8Kl4Cy02ATyYFBZMW7JOo&s=SQE9i-SBWjxsXdj7rytOyNeK0TRCYF5Wq1qls9XGZVk&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/CMakeLists.txt?rev=240794&r1=240793&r2=240794&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/Utils/CMakeLists.txt (original)<br>
> +++ llvm/trunk/lib/Transforms/Utils/CMakeLists.txt Fri Jun 26 11:57:30 2015<br>
> @@ -37,6 +37,7 @@ add_llvm_library(LLVMTransformUtils<br>
>    UnifyFunctionExitNodes.cpp<br>
>    Utils.cpp<br>
>    ValueMapper.cpp<br>
> +  VectorUtils.cpp<br>
><br>
>    ADDITIONAL_HEADER_DIRS<br>
>    ${LLVM_MAIN_INCLUDE_DIR}/llvm/Transforms<br>
><br>
> Copied: llvm/trunk/lib/Transforms/Utils/VectorUtils.cpp (from r240790, llvm/trunk/include/llvm/Transforms/Utils/VectorUtils.h)<br>
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Transforms_Utils_VectorUtils.cpp-3Fp2-3Dllvm_trunk_lib_Transforms_Utils_VectorUtils.cpp-26p1-3Dllvm_trunk_include_llvm_Transforms_Utils_VectorUtils.h-26r1-3D240790-26r2-3D240794-26rev-3D240794-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=uGXSNYYXV9mzaj-p2pNAJL8Kl4Cy02ATyYFBZMW7JOo&s=PKXEOe9JPCePXjwo6jYzdWSZHaJ3_JAsWH7IlU9fw4g&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/VectorUtils.cpp?p2=llvm/trunk/lib/Transforms/Utils/VectorUtils.cpp&p1=llvm/trunk/include/llvm/Transforms/Utils/VectorUtils.h&r1=240790&r2=240794&rev=240794&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/include/llvm/Transforms/Utils/VectorUtils.h (original)<br>
> +++ llvm/trunk/lib/Transforms/Utils/VectorUtils.cpp Fri Jun 26 11:57:30 2015<br>
> @@ -1,4 +1,4 @@<br>
> -//===- llvm/Transforms/Utils/VectorUtils.h - Vector utilities -*- C++ -*-=====//<br>
> +//===----------- VectorUtils.cpp - Vectorizer utility functions -----------===//<br>
>  //<br>
>  //                     The LLVM Compiler Infrastructure<br>
>  //<br>
> @@ -7,25 +7,17 @@<br>
>  //<br>
>  //===----------------------------------------------------------------------===//<br>
>  //<br>
> -// This file defines some vectorizer utilities.<br>
> +// This file defines vectorizer utilities.<br>
>  //<br>
>  //===----------------------------------------------------------------------===//<br>
><br>
> -#ifndef LLVM_TRANSFORMS_UTILS_VECTORUTILS_H<br>
> -#define LLVM_TRANSFORMS_UTILS_VECTORUTILS_H<br>
> -<br>
> -#include "llvm/Analysis/TargetLibraryInfo.h"<br>
> -#include "llvm/IR/IntrinsicInst.h"<br>
> -#include "llvm/IR/Intrinsics.h"<br>
> -<br>
> -namespace llvm {<br>
> +#include "llvm/Transforms/Utils/VectorUtils.h"<br>
><br>
>  /// \brief Identify if the intrinsic is trivially vectorizable.<br>
> -///<br>
>  /// This method returns true if the intrinsic's argument types are all<br>
>  /// scalars for the scalar form of the intrinsic and all vectors for<br>
>  /// the vector form of the intrinsic.<br>
> -static inline bool isTriviallyVectorizable(Intrinsic::ID ID) {<br>
> +bool llvm::isTriviallyVectorizable(Intrinsic::ID ID) {<br>
>    switch (ID) {<br>
>    case Intrinsic::sqrt:<br>
>    case Intrinsic::sin:<br>
> @@ -59,52 +51,72 @@ static inline bool isTriviallyVectorizab<br>
>    }<br>
>  }<br>
><br>
> -static inline bool hasVectorInstrinsicScalarOpd(Intrinsic::ID ID,<br>
> -                                         unsigned ScalarOpdIdx) {<br>
> +/// \brief Identifies if the intrinsic has a scalar operand. It check for<br>
> +/// ctlz,cttz and powi special intrinsics whose argument is scalar.<br>
> +bool llvm::hasVectorInstrinsicScalarOpd(Intrinsic::ID ID,<br>
> +                                        unsigned ScalarOpdIdx) {<br>
>    switch (ID) {<br>
> -    case Intrinsic::ctlz:<br>
> -    case Intrinsic::cttz:<br>
> -    case Intrinsic::powi:<br>
> -      return (ScalarOpdIdx == 1);<br>
> -    default:<br>
> -      return false;<br>
> +  case Intrinsic::ctlz:<br>
> +  case Intrinsic::cttz:<br>
> +  case Intrinsic::powi:<br>
> +    return (ScalarOpdIdx == 1);<br>
> +  default:<br>
> +    return false;<br>
>    }<br>
>  }<br>
><br>
> -static Intrinsic::ID checkUnaryFloatSignature(const CallInst &I,<br>
> -                                              Intrinsic::ID ValidIntrinsicID) {<br>
> +/// \brief Check call has a unary float signature<br>
> +/// It checks following:<br>
> +/// a) call should have a single argument<br>
> +/// b) argument type should be floating point type<br>
> +/// c) call instruction type and argument type should be same<br>
> +/// d) call should only reads memory.<br>
> +/// If all these condition is met then return ValidIntrinsicID<br>
> +/// else return not_intrinsic.<br>
> +llvm::Intrinsic::ID<br>
> +llvm::checkUnaryFloatSignature(const CallInst &I,<br>
> +                               Intrinsic::ID ValidIntrinsicID) {<br>
>    if (I.getNumArgOperands() != 1 ||<br>
>        !I.getArgOperand(0)->getType()->isFloatingPointTy() ||<br>
> -      I.getType() != I.getArgOperand(0)->getType() ||<br>
> -      !I.onlyReadsMemory())<br>
> +      I.getType() != I.getArgOperand(0)->getType() || !I.onlyReadsMemory())<br>
>      return Intrinsic::not_intrinsic;<br>
><br>
>    return ValidIntrinsicID;<br>
>  }<br>
><br>
> -static Intrinsic::ID checkBinaryFloatSignature(const CallInst &I,<br>
> -                                               Intrinsic::ID ValidIntrinsicID) {<br>
> +/// \brief Check call has a binary float signature<br>
> +/// It checks following:<br>
> +/// a) call should have 2 arguments.<br>
> +/// b) arguments type should be floating point type<br>
> +/// c) call instruction type and arguments type should be same<br>
> +/// d) call should only reads memory.<br>
> +/// If all these condition is met then return ValidIntrinsicID<br>
> +/// else return not_intrinsic.<br>
> +llvm::Intrinsic::ID<br>
> +llvm::checkBinaryFloatSignature(const CallInst &I,<br>
> +                                Intrinsic::ID ValidIntrinsicID) {<br>
>    if (I.getNumArgOperands() != 2 ||<br>
>        !I.getArgOperand(0)->getType()->isFloatingPointTy() ||<br>
>        !I.getArgOperand(1)->getType()->isFloatingPointTy() ||<br>
>        I.getType() != I.getArgOperand(0)->getType() ||<br>
> -      I.getType() != I.getArgOperand(1)->getType() ||<br>
> -      !I.onlyReadsMemory())<br>
> +      I.getType() != I.getArgOperand(1)->getType() || !I.onlyReadsMemory())<br>
>      return Intrinsic::not_intrinsic;<br>
><br>
>    return ValidIntrinsicID;<br>
>  }<br>
><br>
> -static Intrinsic::ID<br>
> -getIntrinsicIDForCall(CallInst *CI, const TargetLibraryInfo *TLI) {<br>
> +/// \brief Returns intrinsic ID for call.<br>
> +/// For the input call instruction it finds mapping intrinsic and returns<br>
> +/// its ID, in case it does not found it return not_intrinsic.<br>
> +llvm::Intrinsic::ID llvm::getIntrinsicIDForCall(CallInst *CI,<br>
> +                                                const TargetLibraryInfo *TLI) {<br>
>    // If we have an intrinsic call, check if it is trivially vectorizable.<br>
>    if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI)) {<br>
>      Intrinsic::ID ID = II->getIntrinsicID();<br>
>      if (isTriviallyVectorizable(ID) || ID == Intrinsic::lifetime_start ||<br>
>          ID == Intrinsic::lifetime_end || ID == Intrinsic::assume)<br>
>        return ID;<br>
> -    else<br>
> -      return Intrinsic::not_intrinsic;<br>
> +    return Intrinsic::not_intrinsic;<br>
>    }<br>
><br>
>    if (!TLI)<br>
> @@ -199,7 +211,3 @@ getIntrinsicIDForCall(CallInst *CI, cons<br>
><br>
>    return Intrinsic::not_intrinsic;<br>
>  }<br>
> -<br>
> -} // llvm namespace<br>
> -<br>
> -#endif<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br></div></div>