diff options
author | Richard Sandiford <rsandifo@linux.vnet.ibm.com> | 2013-12-23 14:45:00 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@linux.vnet.ibm.com> | 2013-12-23 14:45:00 +0000 |
commit | b09beed5408f859d8dabfb1a93766d2aedd19280 (patch) | |
tree | 8f7fc8f10d2e6926d244780125bb6f80381886d9 /test | |
parent | 26f1d1cbbce40b3b496d9264064a0ed467f763e6 (diff) | |
download | llvm-b09beed5408f859d8dabfb1a93766d2aedd19280.tar.gz llvm-b09beed5408f859d8dabfb1a93766d2aedd19280.tar.bz2 llvm-b09beed5408f859d8dabfb1a93766d2aedd19280.tar.xz |
Fix Scalarizer handling of vector GEPs with multiple index operands
The old code only worked for one index operand. Also handle "inbounds".
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@197908 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/Transforms/Scalarizer/basic.ll | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/test/Transforms/Scalarizer/basic.ll b/test/Transforms/Scalarizer/basic.ll index c8c1bc0260..67e61057bc 100644 --- a/test/Transforms/Scalarizer/basic.ll +++ b/test/Transforms/Scalarizer/basic.ll @@ -382,6 +382,38 @@ define void @f12(<4 x i32> *%dest, <4 x i32> *%src, i32 %index) { ret void } +; Test vector GEPs with more than one index. +define void @f13(<4 x float *> *%dest, <4 x [4 x float] *> %ptr, <4 x i32> %i, + float *%other) { +; CHECK-LABEL: @f13( +; CHECK: %dest.i0 = bitcast <4 x float*>* %dest to float** +; CHECK: %dest.i1 = getelementptr float** %dest.i0, i32 1 +; CHECK: %dest.i2 = getelementptr float** %dest.i0, i32 2 +; CHECK: %dest.i3 = getelementptr float** %dest.i0, i32 3 +; CHECK: %i.i0 = extractelement <4 x i32> %i, i32 0 +; CHECK: %ptr.i0 = extractelement <4 x [4 x float]*> %ptr, i32 0 +; CHECK: %val.i0 = getelementptr inbounds [4 x float]* %ptr.i0, i32 0, i32 %i.i0 +; CHECK: %i.i1 = extractelement <4 x i32> %i, i32 1 +; CHECK: %ptr.i1 = extractelement <4 x [4 x float]*> %ptr, i32 1 +; CHECK: %val.i1 = getelementptr inbounds [4 x float]* %ptr.i1, i32 1, i32 %i.i1 +; CHECK: %i.i2 = extractelement <4 x i32> %i, i32 2 +; CHECK: %ptr.i2 = extractelement <4 x [4 x float]*> %ptr, i32 2 +; CHECK: %val.i2 = getelementptr inbounds [4 x float]* %ptr.i2, i32 2, i32 %i.i2 +; CHECK: %i.i3 = extractelement <4 x i32> %i, i32 3 +; CHECK: %ptr.i3 = extractelement <4 x [4 x float]*> %ptr, i32 3 +; CHECK: %val.i3 = getelementptr inbounds [4 x float]* %ptr.i3, i32 3, i32 %i.i3 +; CHECK: store float* %val.i0, float** %dest.i0, align 32 +; CHECK: store float* %val.i1, float** %dest.i1, align 8 +; CHECK: store float* %val.i2, float** %dest.i2, align 16 +; CHECK: store float* %val.i3, float** %dest.i3, align 8 +; CHECK: ret void + %val = getelementptr inbounds <4 x [4 x float] *> %ptr, + <4 x i32> <i32 0, i32 1, i32 2, i32 3>, + <4 x i32> %i + store <4 x float *> %val, <4 x float *> *%dest + ret void +} + !0 = metadata !{ metadata !"root" } !1 = metadata !{ metadata !"set1", metadata !0 } !2 = metadata !{ metadata !"set2", metadata !0 } |