[llvm] r181286 - LoopVectorize: getConsecutiveVector must respect signed arithmetic

Bill Wendling isanbard at gmail.com
Wed May 8 11:13:29 PDT 2013


I merged it in there.

Thanks!

-bw

On May 8, 2013, at 10:07 AM, Eric Christopher <echristo at gmail.com> wrote:

> cc'ing Bill explicitly so he notices :)
> 
> -eric
> 
> On Tue, May 7, 2013 at 9:07 PM, Nadav Rotem <nrotem at apple.com> wrote:
>> I would like to see this change go into the 3.3 release branch.
>> 
>> On May 7, 2013, at 7:46 PM, Rafael EspĂ­ndola <rafael.espindola at gmail.com>
>> wrote:
>> 
>> ccing Nadav as I think he is the one that has to approve the patch for 3.3.
>> 
>> On 7 May 2013 09:02, Rafael EspĂ­ndola <rafael.espindola at gmail.com> wrote:
>> 
>> This just missed 3.3 branching. I would like to nominate it for
>> backporting as without it firefox is miscompiled.
>> 
>> On 7 May 2013 00:37, Arnold Schwaighofer <aschwaighofer at apple.com> wrote:
>> 
>> Author: arnolds
>> Date: Mon May  6 23:37:05 2013
>> New Revision: 181286
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=181286&view=rev
>> Log:
>> LoopVectorize: getConsecutiveVector must respect signed arithmetic
>> 
>> We were passing an i32 to ConstantInt::get where an i64 was needed and we
>> must
>> also pass the sign if we pass negatives numbers. The start index passed to
>> getConsecutiveVector must also be signed.
>> 
>> Should fix PR15882.
>> 
>> Added:
>>   llvm/trunk/test/Transforms/LoopVectorize/reverse_induction.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=181286&r1=181285&r2=181286&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp Mon May  6
>> 23:37:05 2013
>> @@ -216,7 +216,7 @@ private:
>>  /// This function adds 0, 1, 2 ... to each vector element, starting at
>> zero.
>>  /// If Negate is set then negative numbers are added e.g. (0, -1, -2,
>> ...).
>>  /// The sequence starts at StartIndex.
>> -  Value *getConsecutiveVector(Value* Val, unsigned StartIdx, bool Negate);
>> +  Value *getConsecutiveVector(Value* Val, int StartIdx, bool Negate);
>> 
>>  /// When we go over instructions in the basic block we rely on previous
>>  /// values within the current basic block or on loop invariant values.
>> @@ -829,7 +829,7 @@ Value *InnerLoopVectorizer::getBroadcast
>>  return Shuf;
>> }
>> 
>> -Value *InnerLoopVectorizer::getConsecutiveVector(Value* Val, unsigned
>> StartIdx,
>> +Value *InnerLoopVectorizer::getConsecutiveVector(Value* Val, int StartIdx,
>>                                                 bool Negate) {
>>  assert(Val->getType()->isVectorTy() && "Must be a vector");
>>  assert(Val->getType()->getScalarType()->isIntegerTy() &&
>> @@ -842,8 +842,8 @@ Value *InnerLoopVectorizer::getConsecuti
>> 
>>  // Create a vector of consecutive numbers from zero to VF.
>>  for (int i = 0; i < VLen; ++i) {
>> -    int Idx = Negate ? (-i): i;
>> -    Indices.push_back(ConstantInt::get(ITy, StartIdx + Idx));
>> +    int64_t Idx = Negate ? (-i) : i;
>> +    Indices.push_back(ConstantInt::get(ITy, StartIdx + Idx, Negate));
>>  }
>> 
>>  // Add the consecutive indices to the vector value.
>> @@ -2072,7 +2072,8 @@ InnerLoopVectorizer::vectorizeBlockInLoo
>>          // After broadcasting the induction variable we need to make the
>>          // vector consecutive by adding  ... -3, -2, -1, 0.
>>          for (unsigned part = 0; part < UF; ++part)
>> -            Entry[part] = getConsecutiveVector(Broadcasted, -VF * part,
>> true);
>> +            Entry[part] = getConsecutiveVector(Broadcasted, -(int)VF *
>> part,
>> +                                               true);
>>          continue;
>>        }
>> 
>> 
>> Added: llvm/trunk/test/Transforms/LoopVectorize/reverse_induction.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopVectorize/reverse_induction.ll?rev=181286&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/Transforms/LoopVectorize/reverse_induction.ll (added)
>> +++ llvm/trunk/test/Transforms/LoopVectorize/reverse_induction.ll Mon May  6
>> 23:37:05 2013
>> @@ -0,0 +1,79 @@
>> +; RUN: opt < %s -loop-vectorize -force-vector-unroll=2
>> -force-vector-width=4 -S | FileCheck %s
>> +
>> +target datalayout =
>> "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
>> +
>> +; Make sure consecutive vector generates correct negative indices.
>> +; PR15882
>> +
>> +; CHECK: reverse_induction_i64
>> +; CHECK: add <4 x i64> %[[SPLAT:.*]], <i64 0, i64 -1, i64 -2, i64 -3>
>> +; CHECK: add <4 x i64> %[[SPLAT]], <i64 -4, i64 -5, i64 -6, i64 -7>
>> +
>> +define i32 @reverse_induction_i64(i64 %startval, i32 * %ptr) {
>> +entry:
>> +  br label %for.body
>> +
>> +for.body:
>> +  %add.i7 = phi i64 [ %startval, %entry ], [ %add.i, %for.body ]
>> +  %i.06 = phi i32 [ 0, %entry ], [ %inc4, %for.body ]
>> +  %redux5 = phi i32 [ 0, %entry ], [ %inc.redux, %for.body ]
>> +  %add.i = add i64 %add.i7, -1
>> +  %kind_.i = getelementptr inbounds i32* %ptr, i64 %add.i
>> +  %tmp.i1 = load i32* %kind_.i, align 4
>> +  %inc.redux = add i32 %tmp.i1, %redux5
>> +  %inc4 = add i32 %i.06, 1
>> +  %exitcond = icmp ne i32 %inc4, 1024
>> +  br i1 %exitcond, label %for.body, label %loopend
>> +
>> +loopend:
>> +  ret i32 %inc.redux
>> +}
>> +
>> +; CHECK: reverse_induction_i128
>> +; CHECK: add <4 x i128> %[[SPLAT:.*]], <i128 0, i128 -1, i128 -2, i128 -3>
>> +; CHECK: add <4 x i128> %[[SPLAT]], <i128 -4, i128 -5, i128 -6, i128 -7>
>> +define i32 @reverse_induction_i128(i128 %startval, i32 * %ptr) {
>> +entry:
>> +  br label %for.body
>> +
>> +for.body:
>> +  %add.i7 = phi i128 [ %startval, %entry ], [ %add.i, %for.body ]
>> +  %i.06 = phi i32 [ 0, %entry ], [ %inc4, %for.body ]
>> +  %redux5 = phi i32 [ 0, %entry ], [ %inc.redux, %for.body ]
>> +  %add.i = add i128 %add.i7, -1
>> +  %kind_.i = getelementptr inbounds i32* %ptr, i128 %add.i
>> +  %tmp.i1 = load i32* %kind_.i, align 4
>> +  %inc.redux = add i32 %tmp.i1, %redux5
>> +  %inc4 = add i32 %i.06, 1
>> +  %exitcond = icmp ne i32 %inc4, 1024
>> +  br i1 %exitcond, label %for.body, label %loopend
>> +
>> +loopend:
>> +  ret i32 %inc.redux
>> +}
>> +
>> +; CHECK: reverse_induction_i16
>> +; CHECK: add <4 x i16> %[[SPLAT:.*]], <i16 0, i16 -1, i16 -2, i16 -3>
>> +; CHECK: add <4 x i16> %[[SPLAT]], <i16 -4, i16 -5, i16 -6, i16 -7>
>> +
>> +define i32 @reverse_induction_i16(i16 %startval, i32 * %ptr) {
>> +entry:
>> +  br label %for.body
>> +
>> +for.body:
>> +  %add.i7 = phi i16 [ %startval, %entry ], [ %add.i, %for.body ]
>> +  %i.06 = phi i32 [ 0, %entry ], [ %inc4, %for.body ]
>> +  %redux5 = phi i32 [ 0, %entry ], [ %inc.redux, %for.body ]
>> +  %add.i = add i16 %add.i7, -1
>> +  %kind_.i = getelementptr inbounds i32* %ptr, i16 %add.i
>> +  %tmp.i1 = load i32* %kind_.i, align 4
>> +  %inc.redux = add i32 %tmp.i1, %redux5
>> +  %inc4 = add i32 %i.06, 1
>> +  %exitcond = icmp ne i32 %inc4, 1024
>> +  br i1 %exitcond, label %for.body, label %loopend
>> +
>> +loopend:
>> +  ret i32 %inc.redux
>> +}
>> +
>> +
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> 
>> 
>> 
>> _______________________________________________
>> 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