Skip to content

Commit 5d92171

Browse files
authored
[X86] combineConcatVectorOps - convert X86ISD::HADD/SUB concatenation to use combineConcatVectorOps recursion (#130579)
Only concatenate X86ISD::HADD/SUB nodes if at least one operand is beneficial to concatenate
1 parent 28fa1fc commit 5d92171

File tree

2 files changed

+11
-8
lines changed

2 files changed

+11
-8
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58419,9 +58419,12 @@ static SDValue combineConcatVectorOps(const SDLoc &DL, MVT VT,
5841958419
case X86ISD::FHSUB:
5842058420
if (!IsSplat && VT.is256BitVector() &&
5842158421
(VT.isFloatingPoint() || Subtarget.hasInt256())) {
58422-
return DAG.getNode(Op0.getOpcode(), DL, VT,
58423-
ConcatSubOperand(VT, Ops, 0),
58424-
ConcatSubOperand(VT, Ops, 1));
58422+
SDValue Concat0 = CombineSubOperand(VT, Ops, 0);
58423+
SDValue Concat1 = CombineSubOperand(VT, Ops, 1);
58424+
if (Concat0 || Concat1)
58425+
return DAG.getNode(Op0.getOpcode(), DL, VT,
58426+
Concat0 ? Concat0 : ConcatSubOperand(VT, Ops, 0),
58427+
Concat1 ? Concat1 : ConcatSubOperand(VT, Ops, 1));
5842558428
}
5842658429
break;
5842758430
case X86ISD::PACKSS:

llvm/test/CodeGen/X86/haddsub-undef.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -694,9 +694,9 @@ define <4 x double> @add_pd_011(<4 x double> %0, <4 x double> %1) {
694694
;
695695
; AVX1-FAST-LABEL: add_pd_011:
696696
; AVX1-FAST: # %bb.0:
697-
; AVX1-FAST-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm2
698-
; AVX1-FAST-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
699-
; AVX1-FAST-NEXT: vhaddpd %ymm2, %ymm0, %ymm0
697+
; AVX1-FAST-NEXT: vhaddpd %xmm0, %xmm1, %xmm2
698+
; AVX1-FAST-NEXT: vhaddpd %xmm1, %xmm0, %xmm0
699+
; AVX1-FAST-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
700700
; AVX1-FAST-NEXT: retq
701701
;
702702
; AVX512-LABEL: add_pd_011:
@@ -1272,9 +1272,9 @@ define <4 x double> @PR34724_add_v4f64_012u(<4 x double> %0, <4 x double> %1) {
12721272
; AVX-FAST-LABEL: PR34724_add_v4f64_012u:
12731273
; AVX-FAST: # %bb.0:
12741274
; AVX-FAST-NEXT: vextractf128 $1, %ymm0, %xmm2
1275+
; AVX-FAST-NEXT: vhaddpd %xmm2, %xmm0, %xmm0
1276+
; AVX-FAST-NEXT: vhaddpd %xmm1, %xmm1, %xmm1
12751277
; AVX-FAST-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1276-
; AVX-FAST-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
1277-
; AVX-FAST-NEXT: vhaddpd %ymm1, %ymm0, %ymm0
12781278
; AVX-FAST-NEXT: retq
12791279
%3 = shufflevector <4 x double> %0, <4 x double> undef, <2 x i32> <i32 0, i32 2>
12801280
%4 = shufflevector <4 x double> %0, <4 x double> undef, <2 x i32> <i32 1, i32 3>

0 commit comments

Comments
 (0)