forked from OSchip/llvm-project
[X86] Give unary PERMI priority over SHUF128 in lowerV8I64VectorShuffle to make it possible to fold a load.
llvm-svn: 317382
This commit is contained in:
parent
918e0ca77a
commit
d21a53f246
|
@ -13709,10 +13709,6 @@ static SDValue lowerV8I64VectorShuffle(const SDLoc &DL, ArrayRef<int> Mask,
|
|||
assert(V2.getSimpleValueType() == MVT::v8i64 && "Bad operand type!");
|
||||
assert(Mask.size() == 8 && "Unexpected mask size for v8 shuffle!");
|
||||
|
||||
if (SDValue Shuf128 =
|
||||
lowerV4X128VectorShuffle(DL, MVT::v8i64, Mask, V1, V2, DAG))
|
||||
return Shuf128;
|
||||
|
||||
if (V2.isUndef()) {
|
||||
// When the shuffle is mirrored between the 128-bit lanes of the unit, we
|
||||
// can use lower latency instructions that will operate on all four
|
||||
|
@ -13734,6 +13730,10 @@ static SDValue lowerV8I64VectorShuffle(const SDLoc &DL, ArrayRef<int> Mask,
|
|||
getV4X86ShuffleImm8ForMask(Repeated256Mask, DL, DAG));
|
||||
}
|
||||
|
||||
if (SDValue Shuf128 =
|
||||
lowerV4X128VectorShuffle(DL, MVT::v8i64, Mask, V1, V2, DAG))
|
||||
return Shuf128;
|
||||
|
||||
// Try to use shift instructions.
|
||||
if (SDValue Shift = lowerVectorShuffleAsShift(DL, MVT::v8i64, V1, V2, Mask,
|
||||
Zeroable, Subtarget, DAG))
|
||||
|
|
|
@ -1165,18 +1165,35 @@ define <8 x i64> @shuffle_v8i64_70000000(<8 x i64> %a, <8 x i64> %b) {
|
|||
define <8 x i64> @shuffle_v8i64_01014545(<8 x i64> %a, <8 x i64> %b) {
|
||||
; AVX512F-LABEL: shuffle_v8i64_01014545:
|
||||
; AVX512F: # BB#0:
|
||||
; AVX512F-NEXT: vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,4,5,4,5]
|
||||
; AVX512F-NEXT: vpermpd {{.*#+}} zmm0 = zmm0[0,1,0,1,4,5,4,5]
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512F-32-LABEL: shuffle_v8i64_01014545:
|
||||
; AVX512F-32: # BB#0:
|
||||
; AVX512F-32-NEXT: vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,4,5,4,5]
|
||||
; AVX512F-32-NEXT: vpermpd {{.*#+}} zmm0 = zmm0[0,1,0,1,4,5,4,5]
|
||||
; AVX512F-32-NEXT: retl
|
||||
|
||||
%shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 4, i32 5, i32 4, i32 5>
|
||||
ret <8 x i64> %shuffle
|
||||
}
|
||||
|
||||
define <8 x i64> @shuffle_v8i64_01014545_mem(<8 x i64>* %ptr, <8 x i64> %b) {
|
||||
; AVX512F-LABEL: shuffle_v8i64_01014545_mem:
|
||||
; AVX512F: # BB#0:
|
||||
; AVX512F-NEXT: vpermpd {{.*#+}} zmm0 = mem[0,1,0,1,4,5,4,5]
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512F-32-LABEL: shuffle_v8i64_01014545_mem:
|
||||
; AVX512F-32: # BB#0:
|
||||
; AVX512F-32-NEXT: movl {{[0-9]+}}(%esp), %eax
|
||||
; AVX512F-32-NEXT: vpermpd {{.*#+}} zmm0 = mem[0,1,0,1,4,5,4,5]
|
||||
; AVX512F-32-NEXT: retl
|
||||
|
||||
%a = load <8 x i64>, <8 x i64>* %ptr
|
||||
%shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 4, i32 5, i32 4, i32 5>
|
||||
ret <8 x i64> %shuffle
|
||||
}
|
||||
|
||||
define <8 x i64> @shuffle_v8i64_00112233(<8 x i64> %a, <8 x i64> %b) {
|
||||
;
|
||||
; AVX512F-LABEL: shuffle_v8i64_00112233:
|
||||
|
|
Loading…
Reference in New Issue