mirror of
https://github.com/RPCSX/llvm.git
synced 2025-03-04 10:59:04 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@299368 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ab1bde3393
commit
f60f35be0a
@ -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) {
|
||||
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user