[llvm] r185299 - LoopVectorize: Math functions only read rounding mode

Duncan Sands duncan.sands at gmail.com
Mon Jul 1 07:52:58 PDT 2013


Hi Arnold, thanks for explaining.  Your patch looks OK to me now :)

Ciao, Duncan.

On 01/07/13 16:46, Arnold Schwaighofer wrote:
> Hi Duncan,
>
> “getIntrinsicIDForCall” is checking this constraint. It is a local function in LoopVectorize that will only return a non zero value for math functions:
>
> static getIntrinsicIDForCall(CallInst *CI, const TargetLibraryInfo *TLI) {
>    // If we have an intrinsic call, check if it is trivially vectorizable.
>    if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI)) {
>      switch (II->getIntrinsicID()) {
>      case Intrinsic::sqrt:
>      case Intrinsic::sin:
>      case Intrinsic::cos:
>      case Intrinsic::exp:
>      case Intrinsic::exp2:
>      case Intrinsic::log:
>      case Intrinsic::log10:
>      case Intrinsic::log2:
>      case Intrinsic::fabs:
>      case Intrinsic::floor:
>      case Intrinsic::ceil:
>      case Intrinsic::trunc:
>      case Intrinsic::rint:
>      case Intrinsic::nearbyint:
>      case Intrinsic::pow:
>      case Intrinsic::fma:
>      case Intrinsic::fmuladd:
>        return II->getIntrinsicID();
>      default:
>        return Intrinsic::not_intrinsic;
>      }
>    }
>    LibFunc::Func Func;
>    Function *F = CI->getCalledFunction();
>    /// ... Do a similar check for LibFunc::Func functions.
>
>
> On Jul 1, 2013, at 9:35 AM, Duncan Sands <duncan.sands at gmail.com> wrote:
>
>> Hi Arnold,
>>
>> On 01/07/13 02:54, Arnold Schwaighofer wrote:
>>> Author: arnolds
>>> Date: Sun Jun 30 19:54:44 2013
>>> New Revision: 185299
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=185299&view=rev
>>> Log:
>>> LoopVectorize: Math functions only read rounding mode
>>>
>>> Math functions are mark as readonly because they read the floating point
>>> rounding mode. Because we don't vectorize loops that would contain function
>>> calls that set the rounding mode it is safe to ignore this memory read.
>>
>> how do you know that the intrinsic is a math intrinsic?  For example it could
>> be an x86 unaligned load intrinsic, vector load intrinsic, or who knows what,
>> that may be reading from some memory that is written to in the loop.
>>
>> Ciao, Duncan.
>>
>>>
>>> Added:
>>>      llvm/trunk/test/Transforms/LoopVectorize/funcall.ll
>>> Modified:
>>>      llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp
>>>
>>> Modified: llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp?rev=185299&r1=185298&r2=185299&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp (original)
>>> +++ llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp Sun Jun 30 19:54:44 2013
>>> @@ -3520,6 +3520,13 @@ bool LoopVectorizationLegality::canVecto
>>>         // but is not a load, then we quit. Notice that we don't handle function
>>>         // calls that read or write.
>>>         if (it->mayReadFromMemory()) {
>>> +        // Many math library functions read the rounding mode. We will only
>>> +        // vectorize a loop if it contains known function calls that don't set
>>> +        // the flag. Therefore, it is safe to ignore this read from memory.
>>> +        CallInst *Call = dyn_cast<CallInst>(it);
>>> +        if (Call && getIntrinsicIDForCall(Call, TLI))
>>> +          continue;
>>> +
>>>           LoadInst *Ld = dyn_cast<LoadInst>(it);
>>>           if (!Ld) return false;
>>>           if (!Ld->isSimple() && !IsAnnotatedParallel) {
>
>




More information about the llvm-commits mailing list