Revert "[DAGCombine] A shuffle of a splat is always the splat itself"

This reverts commit r299047 which is incorrect because the
simplification may result in incorrect propogation of undefs to users of
the folded shuffle.

Thanks to Andrea Di Biagio for pointing this out.

llvm-svn: 299368
This commit is contained in:
Zvi Rackover 2017-04-03 17:41:19 +00:00
parent 44173f7d02
commit d76a4d0ac6
2 changed files with 10 additions and 12 deletions

View File

@ -14633,12 +14633,6 @@ SDValue DAGCombiner::visitVECTOR_SHUFFLE(SDNode *N) {
return DAG.getVectorShuffle(VT, SDLoc(N), N0, N1, NewMask);
}
// A shuffle of a splat is always the splat itself:
// shuffle (splat-shuffle), undef, M --> splat-shuffle
if (auto *N0Shuf = dyn_cast<ShuffleVectorSDNode>(N0))
if (N1.isUndef() && N0Shuf->isSplat())
return N0;
// If it is a splat, check if the argument vector is another splat or a
// build_vector.
if (SVN->isSplat() && SVN->getSplatIndex() < (int)NumElts) {

View File

@ -5,8 +5,9 @@
define <2 x double> @foo2(<2 x double> %v, <2 x double> *%p) nounwind {
; AVX2-LABEL: foo2:
; AVX2: # BB#0:
; AVX2-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,1]
; AVX2-NEXT: vmovapd %xmm0, (%rdi)
; AVX2-NEXT: vpermilpd {{.*#+}} xmm1 = xmm0[1,1]
; AVX2-NEXT: vpermilpd {{.*#+}} xmm0 = xmm1[1,0]
; AVX2-NEXT: vmovapd %xmm1, (%rdi)
; AVX2-NEXT: retq
%res = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 1, i32 1>
%res1 = shufflevector<2 x double> %res, <2 x double> undef, <2 x i32> <i32 1, i32 undef>
@ -17,8 +18,9 @@ define <2 x double> @foo2(<2 x double> %v, <2 x double> *%p) nounwind {
define <4 x double> @foo4(<4 x double> %v, <4 x double> *%p) nounwind {
; AVX2-LABEL: foo4:
; AVX2: # BB#0:
; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[2,2,2,2]
; AVX2-NEXT: vmovapd %ymm0, (%rdi)
; AVX2-NEXT: vpermpd {{.*#+}} ymm1 = ymm0[2,2,2,2]
; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm1[2,0,2,3]
; AVX2-NEXT: vmovapd %ymm1, (%rdi)
; AVX2-NEXT: retq
%res = shufflevector <4 x double> %v, <4 x double> undef, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
%res1 = shufflevector<4 x double> %res, <4 x double> undef, <4 x i32> <i32 2, i32 0, i32 undef, i32 undef>
@ -30,8 +32,10 @@ define <8 x float> @foo8(<8 x float> %v, <8 x float> *%p) nounwind {
; AVX2-LABEL: foo8:
; AVX2: # BB#0:
; AVX2-NEXT: vmovshdup {{.*#+}} ymm0 = ymm0[1,1,3,3,5,5,7,7]
; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[2,2,2,2]
; AVX2-NEXT: vmovapd %ymm0, (%rdi)
; AVX2-NEXT: vpermpd {{.*#+}} ymm1 = ymm0[2,2,2,2]
; AVX2-NEXT: vmovaps {{.*#+}} ymm0 = <2,0,u,u,5,1,3,7>
; AVX2-NEXT: vpermps %ymm1, %ymm0, %ymm0
; AVX2-NEXT: vmovapd %ymm1, (%rdi)
; AVX2-NEXT: retq
%res = shufflevector <8 x float> %v, <8 x float> undef, <8 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
%res1 = shufflevector<8 x float> %res, <8 x float> undef, <8 x i32> <i32 2, i32 0, i32 undef, i32 undef, i32 5, i32 1, i32 3, i32 7>