<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>