[llvm-commits] [llvm] r167032 - in /llvm/trunk: lib/Transforms/Vectorize/LoopVectorize.cpp test/Transforms/LoopVectorize/reduction.ll
Evan Cheng
evan.cheng at apple.com
Tue Oct 30 14:47:51 PDT 2012
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