diff options
| author | Alexey Bataev <a.bataev@hotmail.com> | 2016-09-23 09:14:08 +0000 |
|---|---|---|
| committer | Alexey Bataev <a.bataev@hotmail.com> | 2016-09-23 09:14:08 +0000 |
| commit | fee9078dcd77a067eaad1a5f59f9529faca4376b (patch) | |
| tree | e352ad1165d46aef65f526728f1bcea4288c2989 /llvm/test/Transforms/InstCombine/vector_insertelt_shuffle.ll | |
| parent | 0f8f0d369d719cf3cb785e294463722f94d05cc0 (diff) | |
| download | bcm5719-llvm-fee9078dcd77a067eaad1a5f59f9529faca4376b.tar.gz bcm5719-llvm-fee9078dcd77a067eaad1a5f59f9529faca4376b.zip | |
[InstCombine] Fix for PR29124: reduce insertelements to shufflevector
If inserting more than one constant into a vector:
define <4 x float> @foo(<4 x float> %x) {
%ins1 = insertelement <4 x float> %x, float 1.0, i32 1
%ins2 = insertelement <4 x float> %ins1, float 2.0, i32 2
ret <4 x float> %ins2
}
InstCombine could reduce that to a shufflevector:
define <4 x float> @goo(<4 x float> %x) {
%shuf = shufflevector <4 x float> %x, <4 x float> <float undef, float 1.0, float 2.0, float undef>, <4 x i32><i32 0, i32 5, i32 6, i32 3>
ret <4 x float> %shuf
}
Also, InstCombine tries to convert shuffle instruction to single insertelement, if one of the vectors is a constant vector and only a single element from this constant should be used in shuffle, i.e.
shufflevector <4 x float> %v, <4 x float> <float undef, float 1.0, float
undef, float undef>, <4 x i32> <i32 0, i32 5, i32 undef, i32 undef> ->
insertelement <4 x float> %v, float 1.0, 1
Differential Revision: https://reviews.llvm.org/D24182
llvm-svn: 282237
Diffstat (limited to 'llvm/test/Transforms/InstCombine/vector_insertelt_shuffle.ll')
| -rw-r--r-- | llvm/test/Transforms/InstCombine/vector_insertelt_shuffle.ll | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/llvm/test/Transforms/InstCombine/vector_insertelt_shuffle.ll b/llvm/test/Transforms/InstCombine/vector_insertelt_shuffle.ll index 9b45962569a..b3e614653cf 100644 --- a/llvm/test/Transforms/InstCombine/vector_insertelt_shuffle.ll +++ b/llvm/test/Transforms/InstCombine/vector_insertelt_shuffle.ll @@ -7,10 +7,9 @@ define<4 x float> @foo(<4 x float> %x) { ret<4 x float> %ins2 } -; FIXME: insertelements should fold to shuffle +; insertelements should fold to shuffle ; CHECK-LABEL: @foo -; CHECK-NEXT: insertelement <4 x float> %{{.+}}, float 1.000000e+00, i32 1 -; CHECK-NEXT: insertelement <4 x float> %{{.+}}, float 2.000000e+00, i32 2 +; CHECK-NEXT: shufflevector <4 x float> %{{.+}}, <4 x float> <float undef, float 1.000000e+00, float 2.000000e+00, float undef>, <4 x i32> <i32 0, i32 5, i32 6, i32 3> ; CHECK-NEXT: ret <4 x float> % define<4 x float> @bar(<4 x float> %x, float %a) { @@ -45,12 +44,11 @@ define<4 x float> @bazz(<4 x float> %x, i32 %a) { ret<4 x float> %ins6 } -; FIXME: insertelements should fold to shuffle +; insertelements should fold to shuffle ; CHECK-LABEL: @bazz ; CHECK-NEXT: insertelement <4 x float> %{{.+}}, float 1.000000e+00, i32 3 ; CHECK-NEXT: insertelement <4 x float> %{{.+}}, float 5.000000e+00, i32 % -; CHECK-NEXT: insertelement <4 x float> %{{.+}}, float 1.000000e+00, i32 1 -; CHECK-NEXT: insertelement <4 x float> %{{.+}}, float 2.000000e+00, i32 2 +; CHECK-NEXT: shufflevector <4 x float> %{{.+}}, <4 x float> <float undef, float 1.000000e+00, float 2.000000e+00, float undef>, <4 x i32> <i32 0, i32 5, i32 6, i32 3> ; CHECK-NEXT: insertelement <4 x float> %{{.+}}, float 7.000000e+00, i32 % ; CHECK-NEXT: ret <4 x float> % @@ -75,3 +73,22 @@ define<4 x float> @bazzzz(<4 x float> %x) { ; CHECK-NEXT: insertelement <4 x float> %{{.+}}, float 2.000000e+00, i32 2 ; CHECK-NEXT: ret <4 x float> % +define<4 x float> @bazzzzz() { + %ins1 = insertelement <4 x float> insertelement (<4 x float> <float 1.0, float 2.0, float 3.0, float undef>, float 4.0, i32 3), float 5.0, i32 1 + %ins2 = insertelement<4 x float> %ins1, float 10.0, i32 2 + ret<4 x float> %ins2 +} + +; insertelements should fold to shuffle +; CHECK-LABEL: @bazzzzz +; CHECK-NEXT: ret <4 x float> <float 1.000000e+00, float 5.000000e+00, float 1.000000e+01, float 4.000000e+00> + +define<4 x float> @bazzzzzz(<4 x float> %x, i32 %a) { + %ins1 = insertelement <4 x float> insertelement (<4 x float> shufflevector (<4 x float> undef, <4 x float> <float 1.0, float 2.0, float 3.0, float 4.0> , <4 x i32> <i32 0, i32 5, i32 undef, i32 6> ), float 4.0, i32 3), float 5.0, i32 1 + ret<4 x float> %ins1 +} + +; insertelements should fold to shuffle +; CHECK-LABEL: @bazzzzz +; CHECK-NEXT: ret <4 x float> <float undef, float 5.000000e+00, float undef, float 4.000000e+00> + |

