[llvm] r184103 - Fix for a regression caused by the LoopVectorizer when

Nadav Rotem nrotem at apple.com
Mon Jun 17 14:12:28 PDT 2013


I can see that you fixed both places.  Excellent. You can ignore my second email. 

On Jun 17, 2013, at 11:49 AM, Pekka Jaaskelainen <pekka.jaaskelainen at tut.fi> wrote:

> Author: pjaaskel
> Date: Mon Jun 17 13:49:06 2013
> New Revision: 184103
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=184103&view=rev
> Log:
> Fix for a regression caused by the LoopVectorizer when
> vectorizing loops with memory accesses to non-zero address spaces. It
> simply dropped the AS info. Fixes PR16306.
> 
> 
> Added:
>    llvm/trunk/test/Transforms/LoopVectorize/multiple-address-spaces.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=184103&r1=184102&r2=184103&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp (original)
> +++ llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp Mon Jun 17 13:49:06 2013
> @@ -1178,7 +1178,7 @@ void InnerLoopVectorizer::vectorizeMemor
>   Type *DataTy = VectorType::get(ScalarDataTy, VF);
>   Value *Ptr = LI ? LI->getPointerOperand() : SI->getPointerOperand();
>   unsigned Alignment = LI ? LI->getAlignment() : SI->getAlignment();
> -
> +  unsigned AddressSpace = Ptr->getType()->getPointerAddressSpace();
>   unsigned ScalarAllocatedSize = DL->getTypeAllocSize(ScalarDataTy);
>   unsigned VectorElementSize = DL->getTypeStoreSize(DataTy)/VF;
> 
> @@ -1253,7 +1253,7 @@ void InnerLoopVectorizer::vectorizeMemor
>         PartPtr = Builder.CreateGEP(PartPtr, Builder.getInt32(1 - VF));
>       }
> 
> -      Value *VecPtr = Builder.CreateBitCast(PartPtr, DataTy->getPointerTo());
> +      Value *VecPtr = Builder.CreateBitCast(PartPtr, DataTy->getPointerTo(AddressSpace));
>       Builder.CreateStore(StoredVal[Part], VecPtr)->setAlignment(Alignment);
>     }
>   }
> @@ -1269,7 +1269,7 @@ void InnerLoopVectorizer::vectorizeMemor
>       PartPtr = Builder.CreateGEP(PartPtr, Builder.getInt32(1 - VF));
>     }
> 
> -    Value *VecPtr = Builder.CreateBitCast(PartPtr, DataTy->getPointerTo());
> +    Value *VecPtr = Builder.CreateBitCast(PartPtr, DataTy->getPointerTo(AddressSpace));
>     Value *LI = Builder.CreateLoad(VecPtr, "wide.load");
>     cast<LoadInst>(LI)->setAlignment(Alignment);
>     Entry[Part] = Reverse ? reverseVector(LI) :  LI;
> 
> Added: llvm/trunk/test/Transforms/LoopVectorize/multiple-address-spaces.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopVectorize/multiple-address-spaces.ll?rev=184103&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/LoopVectorize/multiple-address-spaces.ll (added)
> +++ llvm/trunk/test/Transforms/LoopVectorize/multiple-address-spaces.ll Mon Jun 17 13:49:06 2013
> @@ -0,0 +1,47 @@
> +; RUN: opt < %s  -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s
> +
> +; From a simple program with two address spaces:
> +; char Y[4*10000] __attribute__((address_space(1)));
> +; char X[4*10000];
> +; int main() {
> +;    for (int i = 0; i < 4*10000; ++i)
> +;        X[i] = Y[i] + 1;
> +;    return 0;
> +;}
> +
> +
> +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"
> +target triple = "x86_64-unknown-linux-gnu"
> +
> + at Y = common addrspace(1) global [40000 x i8] zeroinitializer, align 16
> + at X = common global [40000 x i8] zeroinitializer, align 16
> +
> +;CHECK: @main
> +;CHECK: bitcast i8 addrspace(1)* %{{.*}} to <4 x i8> addrspace(1)*
> +;CHECK: bitcast i8* %{{.*}} to <4 x i8>*
> +
> +; Function Attrs: nounwind uwtable
> +define i32 @main() #0 {
> +entry:
> +  br label %for.body
> +
> +for.body:                                         ; preds = %for.body, %entry
> +  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
> +  %arrayidx = getelementptr inbounds [40000 x i8] addrspace(1)* @Y, i64 0, i64 %indvars.iv
> +  %0 = load i8 addrspace(1)* %arrayidx, align 1, !tbaa !0
> +  %add = add i8 %0, 1
> +  %arrayidx3 = getelementptr inbounds [40000 x i8]* @X, i64 0, i64 %indvars.iv
> +  store i8 %add, i8* %arrayidx3, align 1, !tbaa !0
> +  %indvars.iv.next = add i64 %indvars.iv, 1
> +  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
> +  %exitcond = icmp eq i32 %lftr.wideiv, 40000
> +  br i1 %exitcond, label %for.end, label %for.body
> +
> +for.end:                                          ; preds = %for.body
> +  ret i32 0
> +}
> +
> +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
> +
> +!0 = metadata !{metadata !"omnipotent char", metadata !1}
> +!1 = metadata !{metadata !"Simple C/C++ TBAA"}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130617/99033425/attachment.html>


More information about the llvm-commits mailing list