Skip to content

Commit 98b0f13

Browse files
committed
[DAG] hoistLogicOpWithSameOpcodeHands - add support for SIGN_EXTEND_INREG nodes.
This can reuse the existing *_EXTEND node handling (with special handling for the valuetype arg)
1 parent 1b32427 commit 98b0f13

File tree

3 files changed

+23
-35
lines changed

3 files changed

+23
-35
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5699,12 +5699,14 @@ SDValue DAGCombiner::hoistLogicOpWithSameOpcodeHands(SDNode *N) {
56995699
// FIXME: We should check number of uses of the operands to not increase
57005700
// the instruction count for all transforms.
57015701

5702-
// Handle size-changing casts.
5702+
// Handle size-changing casts (or sign_extend_inreg).
57035703
SDValue X = N0.getOperand(0);
57045704
SDValue Y = N1.getOperand(0);
57055705
EVT XVT = X.getValueType();
57065706
SDLoc DL(N);
5707-
if (ISD::isExtOpcode(HandOpcode) || ISD::isExtVecInRegOpcode(HandOpcode)) {
5707+
if (ISD::isExtOpcode(HandOpcode) || ISD::isExtVecInRegOpcode(HandOpcode) ||
5708+
(HandOpcode == ISD::SIGN_EXTEND_INREG &&
5709+
N0.getOperand(1) == N0.getOperand(1))) {
57085710
// If both operands have other uses, this transform would create extra
57095711
// instructions without eliminating anything.
57105712
if (!N0.hasOneUse() && !N1.hasOneUse())
@@ -5725,6 +5727,8 @@ SDValue DAGCombiner::hoistLogicOpWithSameOpcodeHands(SDNode *N) {
57255727
return SDValue();
57265728
// logic_op (hand_op X), (hand_op Y) --> hand_op (logic_op X, Y)
57275729
SDValue Logic = DAG.getNode(LogicOpcode, DL, XVT, X, Y);
5730+
if (HandOpcode == ISD::SIGN_EXTEND_INREG)
5731+
return DAG.getNode(HandOpcode, DL, VT, Logic, N0.getOperand(1));
57285732
return DAG.getNode(HandOpcode, DL, VT, Logic);
57295733
}
57305734

llvm/test/CodeGen/X86/pr57402.ll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,9 @@ define void @PR57402() {
1919
; CHECK-NEXT: testb %al, %al
2020
; CHECK-NEXT: jne .LBB0_4
2121
; CHECK-NEXT: # %bb.2: # %entry
22+
; CHECK-NEXT: andl %ecx, %edx
2223
; CHECK-NEXT: movswl %dx, %eax
23-
; CHECK-NEXT: movswl %cx, %ecx
24-
; CHECK-NEXT: andl %eax, %ecx
25-
; CHECK-NEXT: imull %ecx, %eax
24+
; CHECK-NEXT: imull %eax, %eax
2625
; CHECK-NEXT: testq %rax, %rax
2726
; CHECK-NEXT: jne .LBB0_3
2827
; CHECK-NEXT: .LBB0_4: # %if.end

llvm/test/CodeGen/X86/vector-ext-logic.ll

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -325,19 +325,14 @@ define <8 x i32> @bool_zext_xor(<8 x i1> %x, <8 x i1> %y) {
325325
define <8 x i32> @bool_sext_and(<8 x i1> %x, <8 x i1> %y) {
326326
; SSE2-LABEL: bool_sext_and:
327327
; SSE2: # %bb.0:
328-
; SSE2-NEXT: movdqa %xmm1, %xmm3
329-
; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]
330-
; SSE2-NEXT: movdqa %xmm0, %xmm2
331-
; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]
332-
; SSE2-NEXT: pand %xmm3, %xmm2
333-
; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
328+
; SSE2-NEXT: pand %xmm0, %xmm1
329+
; SSE2-NEXT: movdqa %xmm1, %xmm0
334330
; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
335-
; SSE2-NEXT: pand %xmm1, %xmm0
336331
; SSE2-NEXT: pslld $31, %xmm0
337332
; SSE2-NEXT: psrad $31, %xmm0
338-
; SSE2-NEXT: pslld $31, %xmm2
339-
; SSE2-NEXT: psrad $31, %xmm2
340-
; SSE2-NEXT: movdqa %xmm2, %xmm1
333+
; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
334+
; SSE2-NEXT: pslld $31, %xmm1
335+
; SSE2-NEXT: psrad $31, %xmm1
341336
; SSE2-NEXT: retq
342337
;
343338
; AVX2-LABEL: bool_sext_and:
@@ -356,19 +351,14 @@ define <8 x i32> @bool_sext_and(<8 x i1> %x, <8 x i1> %y) {
356351
define <8 x i32> @bool_sext_or(<8 x i1> %x, <8 x i1> %y) {
357352
; SSE2-LABEL: bool_sext_or:
358353
; SSE2: # %bb.0:
359-
; SSE2-NEXT: movdqa %xmm1, %xmm3
360-
; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]
361-
; SSE2-NEXT: movdqa %xmm0, %xmm2
362-
; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]
363-
; SSE2-NEXT: por %xmm3, %xmm2
364-
; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
354+
; SSE2-NEXT: por %xmm0, %xmm1
355+
; SSE2-NEXT: movdqa %xmm1, %xmm0
365356
; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
366-
; SSE2-NEXT: por %xmm1, %xmm0
367357
; SSE2-NEXT: pslld $31, %xmm0
368358
; SSE2-NEXT: psrad $31, %xmm0
369-
; SSE2-NEXT: pslld $31, %xmm2
370-
; SSE2-NEXT: psrad $31, %xmm2
371-
; SSE2-NEXT: movdqa %xmm2, %xmm1
359+
; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
360+
; SSE2-NEXT: pslld $31, %xmm1
361+
; SSE2-NEXT: psrad $31, %xmm1
372362
; SSE2-NEXT: retq
373363
;
374364
; AVX2-LABEL: bool_sext_or:
@@ -387,19 +377,14 @@ define <8 x i32> @bool_sext_or(<8 x i1> %x, <8 x i1> %y) {
387377
define <8 x i32> @bool_sext_xor(<8 x i1> %x, <8 x i1> %y) {
388378
; SSE2-LABEL: bool_sext_xor:
389379
; SSE2: # %bb.0:
390-
; SSE2-NEXT: movdqa %xmm1, %xmm3
391-
; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]
392-
; SSE2-NEXT: movdqa %xmm0, %xmm2
393-
; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]
394-
; SSE2-NEXT: pxor %xmm3, %xmm2
395-
; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
380+
; SSE2-NEXT: pxor %xmm0, %xmm1
381+
; SSE2-NEXT: movdqa %xmm1, %xmm0
396382
; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
397-
; SSE2-NEXT: pxor %xmm1, %xmm0
398383
; SSE2-NEXT: pslld $31, %xmm0
399384
; SSE2-NEXT: psrad $31, %xmm0
400-
; SSE2-NEXT: pslld $31, %xmm2
401-
; SSE2-NEXT: psrad $31, %xmm2
402-
; SSE2-NEXT: movdqa %xmm2, %xmm1
385+
; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
386+
; SSE2-NEXT: pslld $31, %xmm1
387+
; SSE2-NEXT: psrad $31, %xmm1
403388
; SSE2-NEXT: retq
404389
;
405390
; AVX2-LABEL: bool_sext_xor:

0 commit comments

Comments
 (0)