Skip to content

Commit 7661526

Browse files
committed
[X86] combineConcatVectorOps - extend PSHUFD/LW/HW handling to support 512-bit types
VPSHUFD was already getting converted via the VPERMILPS AVX1 fallback
1 parent 57e22f5 commit 7661526

File tree

2 files changed

+31
-15
lines changed

2 files changed

+31
-15
lines changed

Diff for: llvm/lib/Target/X86/X86ISelLowering.cpp

+5-3
Original file line numberDiff line numberDiff line change
@@ -58079,9 +58079,11 @@ static SDValue combineConcatVectorOps(const SDLoc &DL, MVT VT,
5807958079
case X86ISD::PSHUFHW:
5808058080
case X86ISD::PSHUFLW:
5808158081
case X86ISD::PSHUFD:
58082-
// TODO: 512-bit PSHUFD/LW/HW handling
58083-
if (!IsSplat && NumOps == 2 && VT.is256BitVector() &&
58084-
Subtarget.hasInt256() && llvm::all_of(Ops, [Op0](SDValue Op) {
58082+
if (!IsSplat &&
58083+
((VT.is256BitVector() && Subtarget.hasInt256()) ||
58084+
(VT.is512BitVector() && Subtarget.useAVX512Regs() &&
58085+
(EltSizeInBits >= 32 || Subtarget.useBWIRegs()))) &&
58086+
llvm::all_of(Ops, [Op0](SDValue Op) {
5808558087
return Op.getOperand(1) == Op0.getOperand(1);
5808658088
})) {
5808758089
return DAG.getNode(Op0.getOpcode(), DL, VT,

Diff for: llvm/test/CodeGen/X86/vector-shuffle-512-v32.ll

+26-12
Original file line numberDiff line numberDiff line change
@@ -265,23 +265,37 @@ define <32 x i16> @shuffle_v32i16_lshr_00_02_04_06_32_34_36_38_08_10_12_14_40_42
265265
}
266266

267267
define <32 x i16> @shuffle_v32i16_concat_00_00_00_00_04_05_06_07_08_08_08_08_12_13_14_15_16_16_16_16_20_21_22_23_24_24_24_24_28_29_30_31(<16 x i16> %a0, <16 x i16> %a1) {
268-
; ALL-LABEL: shuffle_v32i16_concat_00_00_00_00_04_05_06_07_08_08_08_08_12_13_14_15_16_16_16_16_20_21_22_23_24_24_24_24_28_29_30_31:
269-
; ALL: ## %bb.0:
270-
; ALL-NEXT: vpshuflw {{.*#+}} ymm0 = ymm0[0,0,0,0,4,5,6,7,8,8,8,8,12,13,14,15]
271-
; ALL-NEXT: vpshuflw {{.*#+}} ymm1 = ymm1[0,0,0,0,4,5,6,7,8,8,8,8,12,13,14,15]
272-
; ALL-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
273-
; ALL-NEXT: retq
268+
; KNL-LABEL: shuffle_v32i16_concat_00_00_00_00_04_05_06_07_08_08_08_08_12_13_14_15_16_16_16_16_20_21_22_23_24_24_24_24_28_29_30_31:
269+
; KNL: ## %bb.0:
270+
; KNL-NEXT: vpshuflw {{.*#+}} ymm0 = ymm0[0,0,0,0,4,5,6,7,8,8,8,8,12,13,14,15]
271+
; KNL-NEXT: vpshuflw {{.*#+}} ymm1 = ymm1[0,0,0,0,4,5,6,7,8,8,8,8,12,13,14,15]
272+
; KNL-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
273+
; KNL-NEXT: retq
274+
;
275+
; SKX-LABEL: shuffle_v32i16_concat_00_00_00_00_04_05_06_07_08_08_08_08_12_13_14_15_16_16_16_16_20_21_22_23_24_24_24_24_28_29_30_31:
276+
; SKX: ## %bb.0:
277+
; SKX-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0
278+
; SKX-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
279+
; SKX-NEXT: vpshuflw {{.*#+}} zmm0 = zmm0[0,0,0,0,4,5,6,7,8,8,8,8,12,13,14,15,16,16,16,16,20,21,22,23,24,24,24,24,28,29,30,31]
280+
; SKX-NEXT: retq
274281
%shuffle = shufflevector <16 x i16> %a0, <16 x i16> %a1, <32 x i32> <i32 0, i32 0, i32 0, i32 0, i32 4, i32 5, i32 6, i32 7, i32 8, i32 8, i32 8, i32 8, i32 12, i32 13, i32 14, i32 15, i32 16, i32 16, i32 16, i32 16, i32 20, i32 21, i32 22, i32 23, i32 24, i32 24, i32 24, i32 24, i32 28, i32 29, i32 30, i32 31>
275282
ret <32 x i16> %shuffle
276283
}
277284

278285
define <32 x i16> @shuffle_v32i16_concat_00_01_02_03_04_07_06_04_08_09_10_11_12_15_14_12_16_17_18_19_20_23_22_20_24_25_26_27_28_31_30_28(<16 x i16> %a0, <16 x i16> %a1) {
279-
; ALL-LABEL: shuffle_v32i16_concat_00_01_02_03_04_07_06_04_08_09_10_11_12_15_14_12_16_17_18_19_20_23_22_20_24_25_26_27_28_31_30_28:
280-
; ALL: ## %bb.0:
281-
; ALL-NEXT: vpshufhw {{.*#+}} ymm0 = ymm0[0,1,2,3,4,7,6,4,8,9,10,11,12,15,14,12]
282-
; ALL-NEXT: vpshufhw {{.*#+}} ymm1 = ymm1[0,1,2,3,4,7,6,4,8,9,10,11,12,15,14,12]
283-
; ALL-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
284-
; ALL-NEXT: retq
286+
; KNL-LABEL: shuffle_v32i16_concat_00_01_02_03_04_07_06_04_08_09_10_11_12_15_14_12_16_17_18_19_20_23_22_20_24_25_26_27_28_31_30_28:
287+
; KNL: ## %bb.0:
288+
; KNL-NEXT: vpshufhw {{.*#+}} ymm0 = ymm0[0,1,2,3,4,7,6,4,8,9,10,11,12,15,14,12]
289+
; KNL-NEXT: vpshufhw {{.*#+}} ymm1 = ymm1[0,1,2,3,4,7,6,4,8,9,10,11,12,15,14,12]
290+
; KNL-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
291+
; KNL-NEXT: retq
292+
;
293+
; SKX-LABEL: shuffle_v32i16_concat_00_01_02_03_04_07_06_04_08_09_10_11_12_15_14_12_16_17_18_19_20_23_22_20_24_25_26_27_28_31_30_28:
294+
; SKX: ## %bb.0:
295+
; SKX-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0
296+
; SKX-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
297+
; SKX-NEXT: vpshufhw {{.*#+}} zmm0 = zmm0[0,1,2,3,4,7,6,4,8,9,10,11,12,15,14,12,16,17,18,19,20,23,22,20,24,25,26,27,28,31,30,28]
298+
; SKX-NEXT: retq
285299
%shuffle = shufflevector <16 x i16> %a0, <16 x i16> %a1, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 7, i32 6, i32 4, i32 8, i32 9, i32 10, i32 11, i32 12, i32 15, i32 14, i32 12, i32 16, i32 17, i32 18, i32 19, i32 20, i32 23, i32 22, i32 20, i32 24, i32 25, i32 26, i32 27, i32 28, i32 31, i32 30, i32 28>
286300
ret <32 x i16> %shuffle
287301
}

0 commit comments

Comments
 (0)