forked from OSchip/llvm-project
[X86] Don't generate vbroadcasti128 for v4i64 splats from memory.
We used to erroneously match: (v4i64 shuffle (v2i64 load), <0,0,0,0>) Whereas vbroadcasti128 is more like: (v4i64 shuffle (v2i64 load), <0,1,0,1>) This problem doesn't exist for vbroadcastf128, which kept matching the intrinsic after r231182. We should perhaps re-introduce the intrinsic here as well, but that's a separate issue still being discussed. While there, add some proper vbroadcastf128 tests. We don't currently match those, like for loading vbroadcastsd/ss on AVX (the reg-reg broadcasts where added in AVX2). Fixes PR23886. llvm-svn: 240488
This commit is contained in:
parent
c7b685d997
commit
dd5da3e7ed
|
@ -7860,10 +7860,11 @@ def VBROADCASTSDYrr : avx2_broadcast_reg<0x19, "vbroadcastsd", VR256,
|
|||
int_x86_avx2_vbroadcast_sd_pd_256,
|
||||
WriteFShuffle256>, VEX_L;
|
||||
|
||||
let Predicates = [HasAVX2] in
|
||||
def VBROADCASTI128 : avx_broadcast_no_int<0x5A, "vbroadcasti128", VR256,
|
||||
i128mem, v4i64, loadv2i64,
|
||||
WriteLoad>, VEX_L;
|
||||
let mayLoad = 1, Predicates = [HasAVX2] in
|
||||
def VBROADCASTI128 : AVX8I<0x5A, MRMSrcMem, (outs VR256:$dst),
|
||||
(ins i128mem:$src),
|
||||
"vbroadcasti128\t{$src, $dst|$dst, $src}", []>,
|
||||
Sched<[WriteLoad]>, VEX, VEX_L;
|
||||
|
||||
let Predicates = [HasAVX] in
|
||||
def : Pat<(int_x86_avx_vbroadcastf128_ps_256 addr:$src),
|
||||
|
|
|
@ -900,6 +900,60 @@ define <4 x double> @splat_v4f64(<2 x double> %r) {
|
|||
ret <4 x double> %1
|
||||
}
|
||||
|
||||
define <4 x i64> @splat_mem_v4i64_from_v2i64(<2 x i64>* %ptr) {
|
||||
; AVX1-LABEL: splat_mem_v4i64_from_v2i64:
|
||||
; AVX1: # BB#0:
|
||||
; AVX1-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]
|
||||
; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
|
||||
; AVX1-NEXT: retq
|
||||
;
|
||||
; AVX2-LABEL: splat_mem_v4i64_from_v2i64:
|
||||
; AVX2: # BB#0:
|
||||
; AVX2-NEXT: vbroadcastsd (%rdi), %ymm0
|
||||
; AVX2-NEXT: retq
|
||||
%v = load <2 x i64>, <2 x i64>* %ptr
|
||||
%shuffle = shufflevector <2 x i64> %v, <2 x i64> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
|
||||
ret <4 x i64> %shuffle
|
||||
}
|
||||
|
||||
define <4 x double> @splat_mem_v4f64_from_v2f64(<2 x double>* %ptr) {
|
||||
; AVX1-LABEL: splat_mem_v4f64_from_v2f64:
|
||||
; AVX1: # BB#0:
|
||||
; AVX1-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]
|
||||
; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
|
||||
; AVX1-NEXT: retq
|
||||
;
|
||||
; AVX2-LABEL: splat_mem_v4f64_from_v2f64:
|
||||
; AVX2: # BB#0:
|
||||
; AVX2-NEXT: vbroadcastsd (%rdi), %ymm0
|
||||
; AVX2-NEXT: retq
|
||||
%v = load <2 x double>, <2 x double>* %ptr
|
||||
%shuffle = shufflevector <2 x double> %v, <2 x double> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
|
||||
ret <4 x double> %shuffle
|
||||
}
|
||||
|
||||
define <4 x i64> @splat128_mem_v4i64_from_v2i64(<2 x i64>* %ptr) {
|
||||
; ALL-LABEL: splat128_mem_v4i64_from_v2i64:
|
||||
; ALL: # BB#0:
|
||||
; ALL-NEXT: vmovaps (%rdi), %xmm0
|
||||
; ALL-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
|
||||
; ALL-NEXT: retq
|
||||
%v = load <2 x i64>, <2 x i64>* %ptr
|
||||
%shuffle = shufflevector <2 x i64> %v, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
|
||||
ret <4 x i64> %shuffle
|
||||
}
|
||||
|
||||
define <4 x double> @splat128_mem_v4f64_from_v2f64(<2 x double>* %ptr) {
|
||||
; ALL-LABEL: splat128_mem_v4f64_from_v2f64:
|
||||
; ALL: # BB#0:
|
||||
; ALL-NEXT: vmovaps (%rdi), %xmm0
|
||||
; ALL-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
|
||||
; ALL-NEXT: retq
|
||||
%v = load <2 x double>, <2 x double>* %ptr
|
||||
%shuffle = shufflevector <2 x double> %v, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
|
||||
ret <4 x double> %shuffle
|
||||
}
|
||||
|
||||
define <4 x double> @bitcast_v4f64_0426(<4 x double> %a, <4 x double> %b) {
|
||||
; AVX1-LABEL: bitcast_v4f64_0426:
|
||||
; AVX1: # BB#0:
|
||||
|
|
Loading…
Reference in New Issue