diff options
| author | Nadav Rotem <nrotem@apple.com> | 2013-05-12 22:58:45 +0000 |
|---|---|---|
| committer | Nadav Rotem <nrotem@apple.com> | 2013-05-12 22:58:45 +0000 |
| commit | ce42cc6d4dd2a07cba6205222c940d326a7fd3b2 (patch) | |
| tree | 44bc934d624e5293107b97486b8736e93e080142 /llvm/test/Transforms/SLPVectorizer/X86/diamond.ll | |
| parent | cbf6d24d505e8c2f1857ce9618d6028bb4d2e980 (diff) | |
| download | bcm5719-llvm-ce42cc6d4dd2a07cba6205222c940d326a7fd3b2.tar.gz bcm5719-llvm-ce42cc6d4dd2a07cba6205222c940d326a7fd3b2.zip | |
SLPVectorizer: Fix a bug in the code that generates extracts for values with multiple users.
The external user does not have to be in lane #0. We have to save the lane for each scalar so that we know which vector lane to extract.
llvm-svn: 181674
Diffstat (limited to 'llvm/test/Transforms/SLPVectorizer/X86/diamond.ll')
| -rw-r--r-- | llvm/test/Transforms/SLPVectorizer/X86/diamond.ll | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/llvm/test/Transforms/SLPVectorizer/X86/diamond.ll b/llvm/test/Transforms/SLPVectorizer/X86/diamond.ll index 49c8712d202..8959b0d9eec 100644 --- a/llvm/test/Transforms/SLPVectorizer/X86/diamond.ll +++ b/llvm/test/Transforms/SLPVectorizer/X86/diamond.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -basicaa -slp-vectorizer -dce -S -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | FileCheck %s +; RUN: opt < %s -basicaa -slp-vectorizer -S -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | 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" target triple = "x86_64-apple-macosx10.8.0" @@ -74,6 +74,34 @@ entry: %add20 = mul i32 %3, %mul238 %arrayidx21 = getelementptr inbounds i32* %B, i64 3 store i32 %add20, i32* %arrayidx21, align 4 - ret i32 %0 ;<--------- This value has multiple users and can't be vectorized. + ret i32 %0 ;<--------- This value has multiple users } +; In this example we have an external user that is not the first element in the vector. +; CHECK: @extr_user1 +; CHECK: store <4 x i32> +; CHECK-NEXT: extractelement <4 x i32> +; CHECK: ret +define i32 @extr_user1(i32* noalias nocapture %B, i32* noalias nocapture %A, i32 %n, i32 %m) { +entry: + %0 = load i32* %A, align 4 + %mul238 = add i32 %m, %n + %add = mul i32 %0, %mul238 + store i32 %add, i32* %B, align 4 + %arrayidx4 = getelementptr inbounds i32* %A, i64 1 + %1 = load i32* %arrayidx4, align 4 + %add8 = mul i32 %1, %mul238 + %arrayidx9 = getelementptr inbounds i32* %B, i64 1 + store i32 %add8, i32* %arrayidx9, align 4 + %arrayidx10 = getelementptr inbounds i32* %A, i64 2 + %2 = load i32* %arrayidx10, align 4 + %add14 = mul i32 %2, %mul238 + %arrayidx15 = getelementptr inbounds i32* %B, i64 2 + store i32 %add14, i32* %arrayidx15, align 4 + %arrayidx16 = getelementptr inbounds i32* %A, i64 3 + %3 = load i32* %arrayidx16, align 4 + %add20 = mul i32 %3, %mul238 + %arrayidx21 = getelementptr inbounds i32* %B, i64 3 + store i32 %add20, i32* %arrayidx21, align 4 + ret i32 %1 ;<--------- This value has multiple users +} |

