[X86] Add test cases for missed opportunities to use vpternlog due to a bitcast between the logic ops.
These test cases fail to use vpternlog because the AND was converted to a blend shuffle and then converted back to AND during shuffle lowering. This results in the AND having a different type than it started with. This prevents our custom matching logic from seeing the two logic ops.
This commit is contained in:
parent
d8c35031a3
commit
47872adf6a
|
@ -885,3 +885,37 @@ define <16 x i32> @ternlog_xor_andn(<16 x i32> %x, <16 x i32> %y, <16 x i32> %z)
|
|||
%c = xor <16 x i32> %b, %z
|
||||
ret <16 x i32> %c
|
||||
}
|
||||
|
||||
define <16 x i32> @ternlog_or_and_mask(<16 x i32> %x, <16 x i32> %y) {
|
||||
; KNL-LABEL: ternlog_or_and_mask:
|
||||
; KNL: ## %bb.0:
|
||||
; KNL-NEXT: vpandq {{.*}}(%rip), %zmm0, %zmm0
|
||||
; KNL-NEXT: vpord %zmm1, %zmm0, %zmm0
|
||||
; KNL-NEXT: retq
|
||||
;
|
||||
; SKX-LABEL: ternlog_or_and_mask:
|
||||
; SKX: ## %bb.0:
|
||||
; SKX-NEXT: vandps {{.*}}(%rip), %zmm0, %zmm0
|
||||
; SKX-NEXT: vorps %zmm1, %zmm0, %zmm0
|
||||
; SKX-NEXT: retq
|
||||
%a = and <16 x i32> %x, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
|
||||
%b = or <16 x i32> %a, %y
|
||||
ret <16 x i32> %b
|
||||
}
|
||||
|
||||
define <8 x i64> @ternlog_xor_and_mask(<8 x i64> %x, <8 x i64> %y) {
|
||||
; KNL-LABEL: ternlog_xor_and_mask:
|
||||
; KNL: ## %bb.0:
|
||||
; KNL-NEXT: vpandd {{.*}}(%rip), %zmm0, %zmm0
|
||||
; KNL-NEXT: vpxorq %zmm1, %zmm0, %zmm0
|
||||
; KNL-NEXT: retq
|
||||
;
|
||||
; SKX-LABEL: ternlog_xor_and_mask:
|
||||
; SKX: ## %bb.0:
|
||||
; SKX-NEXT: vandps {{.*}}(%rip), %zmm0, %zmm0
|
||||
; SKX-NEXT: vxorps %zmm1, %zmm0, %zmm0
|
||||
; SKX-NEXT: retq
|
||||
%a = and <8 x i64> %x, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
|
||||
%b = xor <8 x i64> %a, %y
|
||||
ret <8 x i64> %b
|
||||
}
|
||||
|
|
|
@ -987,3 +987,47 @@ define <4 x i32> @ternlog_xor_andn(<4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {
|
|||
%c = xor <4 x i32> %b, %z
|
||||
ret <4 x i32> %c
|
||||
}
|
||||
|
||||
define <4 x i32> @ternlog_or_and_mask(<4 x i32> %x, <4 x i32> %y) {
|
||||
; CHECK-LABEL: ternlog_or_and_mask:
|
||||
; CHECK: ## %bb.0:
|
||||
; CHECK-NEXT: vandps {{.*}}(%rip), %xmm0, %xmm0
|
||||
; CHECK-NEXT: vorps %xmm1, %xmm0, %xmm0
|
||||
; CHECK-NEXT: retq
|
||||
%a = and <4 x i32> %x, <i32 255, i32 255, i32 255, i32 255>
|
||||
%b = or <4 x i32> %a, %y
|
||||
ret <4 x i32> %b
|
||||
}
|
||||
|
||||
define <8 x i32> @ternlog_or_and_mask_ymm(<8 x i32> %x, <8 x i32> %y) {
|
||||
; CHECK-LABEL: ternlog_or_and_mask_ymm:
|
||||
; CHECK: ## %bb.0:
|
||||
; CHECK-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
|
||||
; CHECK-NEXT: vorps %ymm1, %ymm0, %ymm0
|
||||
; CHECK-NEXT: retq
|
||||
%a = and <8 x i32> %x, <i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216>
|
||||
%b = or <8 x i32> %a, %y
|
||||
ret <8 x i32> %b
|
||||
}
|
||||
|
||||
define <2 x i64> @ternlog_xor_and_mask(<2 x i64> %x, <2 x i64> %y) {
|
||||
; CHECK-LABEL: ternlog_xor_and_mask:
|
||||
; CHECK: ## %bb.0:
|
||||
; CHECK-NEXT: vandps {{.*}}(%rip), %xmm0, %xmm0
|
||||
; CHECK-NEXT: vxorps %xmm1, %xmm0, %xmm0
|
||||
; CHECK-NEXT: retq
|
||||
%a = and <2 x i64> %x, <i64 1099511627775, i64 1099511627775>
|
||||
%b = xor <2 x i64> %a, %y
|
||||
ret <2 x i64> %b
|
||||
}
|
||||
|
||||
define <4 x i64> @ternlog_xor_and_mask_ymm(<4 x i64> %x, <4 x i64> %y) {
|
||||
; CHECK-LABEL: ternlog_xor_and_mask_ymm:
|
||||
; CHECK: ## %bb.0:
|
||||
; CHECK-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
|
||||
; CHECK-NEXT: vxorps %ymm1, %ymm0, %ymm0
|
||||
; CHECK-NEXT: retq
|
||||
%a = and <4 x i64> %x, <i64 72057594037927935, i64 72057594037927935, i64 72057594037927935, i64 72057594037927935>
|
||||
%b = xor <4 x i64> %a, %y
|
||||
ret <4 x i64> %b
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue