Skip to content

Commit ab3ea27

Browse files
committed
[X86][AVX] Reuse existing VBROADCAST(x) for SCALAR_TO_VECTOR(x)
Similar to what we already do for BROADCASTs of different vector sizes - if we're going to broadcast it anyway might as well reuse it.
1 parent 0fe6481 commit ab3ea27

File tree

2 files changed

+17
-21
lines changed

2 files changed

+17
-21
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49880,6 +49880,14 @@ static SDValue combineScalarToVector(SDNode *N, SelectionDAG &DAG) {
4988049880
Src.getOperand(0).getValueType() == MVT::x86mmx)
4988149881
return DAG.getNode(X86ISD::MOVQ2DQ, DL, VT, Src.getOperand(0));
4988249882

49883+
// See if we're broadcasting the scalar value, in which case just reuse that.
49884+
// Ensure the same SDValue from the SDNode use is being used.
49885+
// TODO: Handle different vector sizes when we have test coverage.
49886+
for (SDNode *User : Src->uses())
49887+
if (User->getOpcode() == X86ISD::VBROADCAST && Src == User->getOperand(0) &&
49888+
User->getValueSizeInBits(0).getFixedSize() == VT.getFixedSizeInBits())
49889+
return SDValue(User, 0);
49890+
4988349891
return SDValue();
4988449892
}
4988549893

llvm/test/CodeGen/X86/combine-bitselect.ll

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -253,29 +253,17 @@ define <2 x i64> @bitselect_v2i64_broadcast_rrm(<2 x i64> %a0, <2 x i64> %a1, i6
253253
;
254254
; XOP-LABEL: bitselect_v2i64_broadcast_rrm:
255255
; XOP: # %bb.0:
256-
; XOP-NEXT: vmovsd {{.*#+}} xmm2 = mem[0],zero
257-
; XOP-NEXT: vpermilps {{.*#+}} xmm2 = xmm2[0,1,0,1]
258-
; XOP-NEXT: vandps %xmm2, %xmm0, %xmm0
259-
; XOP-NEXT: vandnps %xmm1, %xmm2, %xmm1
260-
; XOP-NEXT: vorps %xmm1, %xmm0, %xmm0
256+
; XOP-NEXT: vmovddup {{.*#+}} xmm2 = mem[0,0]
257+
; XOP-NEXT: vpcmov %xmm2, %xmm1, %xmm0, %xmm0
261258
; XOP-NEXT: retq
262259
;
263-
; AVX1-LABEL: bitselect_v2i64_broadcast_rrm:
264-
; AVX1: # %bb.0:
265-
; AVX1-NEXT: vmovsd {{.*#+}} xmm2 = mem[0],zero
266-
; AVX1-NEXT: vpermilps {{.*#+}} xmm2 = xmm2[0,1,0,1]
267-
; AVX1-NEXT: vandps %xmm2, %xmm0, %xmm0
268-
; AVX1-NEXT: vandnps %xmm1, %xmm2, %xmm1
269-
; AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
270-
; AVX1-NEXT: retq
271-
;
272-
; AVX2-LABEL: bitselect_v2i64_broadcast_rrm:
273-
; AVX2: # %bb.0:
274-
; AVX2-NEXT: vmovddup {{.*#+}} xmm2 = mem[0,0]
275-
; AVX2-NEXT: vandps %xmm2, %xmm0, %xmm0
276-
; AVX2-NEXT: vandnps %xmm1, %xmm2, %xmm1
277-
; AVX2-NEXT: vorps %xmm1, %xmm0, %xmm0
278-
; AVX2-NEXT: retq
260+
; AVX-LABEL: bitselect_v2i64_broadcast_rrm:
261+
; AVX: # %bb.0:
262+
; AVX-NEXT: vmovddup {{.*#+}} xmm2 = mem[0,0]
263+
; AVX-NEXT: vandps %xmm2, %xmm0, %xmm0
264+
; AVX-NEXT: vandnps %xmm1, %xmm2, %xmm1
265+
; AVX-NEXT: vorps %xmm1, %xmm0, %xmm0
266+
; AVX-NEXT: retq
279267
;
280268
; AVX512F-LABEL: bitselect_v2i64_broadcast_rrm:
281269
; AVX512F: # %bb.0:

0 commit comments

Comments
 (0)