[llvm-commits] [llvm] r167032 - in /llvm/trunk: lib/Transforms/Vectorize/LoopVectorize.cpp test/Transforms/LoopVectorize/reduction.ll

Nadav Rotem nrotem at apple.com
Tue Oct 30 15:08:11 PDT 2012


Done in r167055. 

Thanks

On Oct 30, 2012, at 2:47 PM, Evan Cheng <evan.cheng at apple.com> wrote:

> 
> On Oct 30, 2012, at 11:12 AM, Nadav Rotem <nrotem at apple.com> wrote:
> 
>> Author: nadav
>> Date: Tue Oct 30 13:12:36 2012
>> New Revision: 167032
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=167032&view=rev
>> Log:
>> LoopVectorize: Fix a bug in the initialization of reduction variables. AND needs to start at all-one
>> while XOR, and OR need to start at zero.
>> 
>> 
>> Modified:
>>   llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp
>>   llvm/trunk/test/Transforms/LoopVectorize/reduction.ll
>> 
>> Modified: llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp?rev=167032&r1=167031&r2=167032&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp Tue Oct 30 13:12:36 2012
>> @@ -211,8 +211,6 @@
>>  TheLoop(Lp), SE(Se), DL(Dl), Induction(0) { }
>> 
>>  /// This represents the kinds of reductions that we support.
>> -  /// We use the enum values to hold the 'identity' value for
>> -  /// each operand. This value does not change the result if applied.
>>  enum ReductionKind {
>>    NoReduction = -1, /// Not a reduction.
>>    IntegerAdd  = 0,  /// Sum of numbers.
>> @@ -523,7 +521,7 @@
>>  SmallVector<Constant*, 8> Indices;
>>  // Create a vector of consecutive numbers from zero to VF.
>>  for (unsigned i = 0; i < VF; ++i)
>> -    Indices.push_back(ConstantInt::get(ScalarTy, Val));
>> +    Indices.push_back(ConstantInt::get(ScalarTy, Val, true));
>> 
>>  // Add the consecutive indices to the vector value.
>>  return ConstantVector::get(Indices);
>> @@ -750,6 +748,23 @@
>>  LoopBypassBlock = BypassBlock;
>> }
>> 
>> +
>> +static unsigned
>> +getReductionIdentity(LoopVectorizationLegality::ReductionKind K) {
>> +  switch (K) {
>> +  case LoopVectorizationLegality::IntegerXor:
>> +  case LoopVectorizationLegality::IntegerAdd:
>> +  case LoopVectorizationLegality::IntegerOr:
>> +    return 0;
>> +  case LoopVectorizationLegality::IntegerMult:
>> +    return 1;
>> +  case LoopVectorizationLegality::IntegerAnd:
>> +    return -1;
>> +  default:
>> +    llvm_unreachable("Unknown reduction kind");
>> +  }
>> +}
>> +
> 
> It seems like this function can do with some comments.
> 
> Evan
> 
>> void
>> SingleBlockLoopVectorizer::vectorizeLoop(LoopVectorizationLegality *Legal) {
>>  //===------------------------------------------------===//
>> @@ -974,10 +989,9 @@
>>    Value *VectorExit = getVectorValue(RdxDesc.LoopExitInstr);
>>    Type *VecTy = VectorExit->getType();
>> 
>> -    // Find the reduction identity variable. The value of the enum is the
>> -    // identity. Zero for addition. One for Multiplication.
>> -    unsigned IdentitySclr =  RdxDesc.Kind;
>> -    Constant *Identity = getUniformVector(IdentitySclr,
>> +    // Find the reduction identity variable. Zero for addition, or, xor,
>> +    // one for multiplication, -1 for And.
>> +    Constant *Identity = getUniformVector(getReductionIdentity(RdxDesc.Kind),
>>                                          VecTy->getScalarType());
>> 
>>    // This vector is the Identity vector where the first element is the
>> 
>> Modified: llvm/trunk/test/Transforms/LoopVectorize/reduction.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopVectorize/reduction.ll?rev=167032&r1=167031&r2=167032&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/Transforms/LoopVectorize/reduction.ll (original)
>> +++ llvm/trunk/test/Transforms/LoopVectorize/reduction.ll Tue Oct 30 13:12:36 2012
>> @@ -151,6 +151,7 @@
>> 
>> ;CHECK: @reduction_and
>> ;CHECK: and <4 x i32>
>> +;CHECK: <i32 -1, i32 -1, i32 -1, i32 -1>
>> ;CHECK: ret i32
>> define i32 @reduction_and(i32 %n, i32* nocapture %A, i32* nocapture %B) nounwind uwtable readonly {
>> entry:
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 




More information about the llvm-commits mailing list