diff options
| author | Karthik Bhat <kv.bhat@samsung.com> | 2014-08-25 04:56:54 +0000 | 
|---|---|---|
| committer | Karthik Bhat <kv.bhat@samsung.com> | 2014-08-25 04:56:54 +0000 | 
| commit | 7f33ff7deaea1454422a99d3a497fa0d11955e2a (patch) | |
| tree | 87a2d6dddf2342728ee8a1d9c75dfe0bc5ed05d2 /llvm/test | |
| parent | c6914d068f317f3c8bc9734b6bbeb090975b50b1 (diff) | |
| download | bcm5719-llvm-7f33ff7deaea1454422a99d3a497fa0d11955e2a.tar.gz bcm5719-llvm-7f33ff7deaea1454422a99d3a497fa0d11955e2a.zip | |
Allow vectorization of division by uniform power of 2.
This patch adds support to recognize division by uniform power of 2 and modifies the cost table to vectorize division by uniform power of 2 whenever possible.
Updates Cost model for Loop and SLP Vectorizer.The cost table is currently only updated for X86 backend.
Thanks to Hal, Andrea, Sanjay for the review. (http://reviews.llvm.org/D4971)
llvm-svn: 216371
Diffstat (limited to 'llvm/test')
| -rw-r--r-- | llvm/test/Transforms/LoopVectorize/X86/powof2div.ll | 32 | ||||
| -rw-r--r-- | llvm/test/Transforms/SLPVectorizer/X86/powof2div.ll | 43 | 
2 files changed, 75 insertions, 0 deletions
| diff --git a/llvm/test/Transforms/LoopVectorize/X86/powof2div.ll b/llvm/test/Transforms/LoopVectorize/X86/powof2div.ll new file mode 100644 index 00000000000..054da8ed20a --- /dev/null +++ b/llvm/test/Transforms/LoopVectorize/X86/powof2div.ll @@ -0,0 +1,32 @@ +; RUN: opt < %s  -loop-vectorize -mtriple=x86_64-unknown-linux-gnu -S | FileCheck %s +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +%struct.anon = type { [100 x i32], i32, [100 x i32] } + +@Foo = common global %struct.anon zeroinitializer, align 4 + +;CHECK-LABEL: @foo( +;CHECK: load <4 x i32>* +;CHECK: sdiv <4 x i32> +;CHECK: store <4 x i32> + +define void @foo(){ +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 %struct.anon* @Foo, i64 0, i32 2, i64 %indvars.iv +  %0 = load i32* %arrayidx, align 4 +  %div = sdiv i32 %0, 2 +  %arrayidx2 = getelementptr inbounds %struct.anon* @Foo, i64 0, i32 0, i64 %indvars.iv +  store i32 %div, i32* %arrayidx2, align 4 +  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 +  %exitcond = icmp eq i64 %indvars.iv.next, 100 +  br i1 %exitcond, label %for.end, label %for.body + +for.end:                                          ; preds = %for.body +  ret void +} + diff --git a/llvm/test/Transforms/SLPVectorizer/X86/powof2div.ll b/llvm/test/Transforms/SLPVectorizer/X86/powof2div.ll new file mode 100644 index 00000000000..b82cd4dd236 --- /dev/null +++ b/llvm/test/Transforms/SLPVectorizer/X86/powof2div.ll @@ -0,0 +1,43 @@ +; RUN: opt < %s -basicaa -slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7-avx | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +;CHECK-LABEL: @powof2div( +;CHECK: load <4 x i32>* +;CHECK: add <4 x i32> +;CHECK: sdiv <4 x i32> +define void @powof2div(i32* noalias nocapture %a, i32* noalias nocapture readonly %b, i32* noalias nocapture readonly %c){ +entry: +  %0 = load i32* %b, align 4 +  %1 = load i32* %c, align 4 +  %add = add nsw i32 %1, %0 +  %div = sdiv i32 %add, 2 +  store i32 %div, i32* %a, align 4 +  %arrayidx3 = getelementptr inbounds i32* %b, i64 1 +  %2 = load i32* %arrayidx3, align 4 +  %arrayidx4 = getelementptr inbounds i32* %c, i64 1 +  %3 = load i32* %arrayidx4, align 4 +  %add5 = add nsw i32 %3, %2 +  %div6 = sdiv i32 %add5, 2 +  %arrayidx7 = getelementptr inbounds i32* %a, i64 1 +  store i32 %div6, i32* %arrayidx7, align 4 +  %arrayidx8 = getelementptr inbounds i32* %b, i64 2 +  %4 = load i32* %arrayidx8, align 4 +  %arrayidx9 = getelementptr inbounds i32* %c, i64 2 +  %5 = load i32* %arrayidx9, align 4 +  %add10 = add nsw i32 %5, %4 +  %div11 = sdiv i32 %add10, 2 +  %arrayidx12 = getelementptr inbounds i32* %a, i64 2 +  store i32 %div11, i32* %arrayidx12, align 4 +  %arrayidx13 = getelementptr inbounds i32* %b, i64 3 +  %6 = load i32* %arrayidx13, align 4 +  %arrayidx14 = getelementptr inbounds i32* %c, i64 3 +  %7 = load i32* %arrayidx14, align 4 +  %add15 = add nsw i32 %7, %6 +  %div16 = sdiv i32 %add15, 2 +  %arrayidx17 = getelementptr inbounds i32* %a, i64 3 +  store i32 %div16, i32* %arrayidx17, align 4 +  ret void +} + | 

