Skip to content

Commit 8121a10

Browse files
committed
[SelectionDAG] Move sign pattern check from AArch64 and ARM to general SelectionDAG
1 parent 9e0dc4f commit 8121a10

File tree

4 files changed

+29
-40
lines changed

4 files changed

+29
-40
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28972,6 +28972,19 @@ SDValue DAGCombiner::SimplifySelectCC(const SDLoc &DL, SDValue N0, SDValue N1,
2897228972
DAG.getSExtOrTrunc(CC == ISD::SETLT ? N3 : N2, DL, VT));
2897328973
}
2897428974

28975+
// Check for sign pattern (SELECT_CC setgt, iN X, -1, 1, -1) and transform
28976+
// into (or (ashr X, BW-1), 1).
28977+
if (CC == ISD::SETGT && N1C && N2C && N3C && N1C->isAllOnes() &&
28978+
N2C->isOne() && N3C->isAllOnes() &&
28979+
!TLI.shouldAvoidTransformToShift(CmpOpVT,
28980+
CmpOpVT.getScalarSizeInBits() - 1)) {
28981+
SDValue ASR = DAG.getNode(
28982+
ISD::SRA, DL, CmpOpVT, N0,
28983+
DAG.getConstant(CmpOpVT.getScalarSizeInBits() - 1, DL, CmpOpVT));
28984+
return DAG.getNode(ISD::OR, DL, VT, DAG.getSExtOrTrunc(ASR, DL, VT),
28985+
DAG.getConstant(1, DL, VT));
28986+
}
28987+
2897528988
if (SDValue S = PerformMinMaxFpToSatCombine(N0, N1, N2, N3, CC, DAG))
2897628989
return S;
2897728990
if (SDValue S = PerformUMinFpToSatCombine(N0, N1, N2, N3, CC, DAG))

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11360,18 +11360,6 @@ SDValue AArch64TargetLowering::LowerSELECT_CC(
1136011360
ConstantSDNode *CFVal = dyn_cast<ConstantSDNode>(FVal);
1136111361
ConstantSDNode *CTVal = dyn_cast<ConstantSDNode>(TVal);
1136211362
ConstantSDNode *RHSC = dyn_cast<ConstantSDNode>(RHS);
11363-
// Check for sign pattern (SELECT_CC setgt, iN lhs, -1, 1, -1) and transform
11364-
// into (OR (ASR lhs, N-1), 1), which requires less instructions for the
11365-
// supported types.
11366-
if (CC == ISD::SETGT && RHSC && RHSC->isAllOnes() && CTVal && CFVal &&
11367-
CTVal->isOne() && CFVal->isAllOnes() &&
11368-
LHS.getValueType() == TVal.getValueType()) {
11369-
EVT VT = LHS.getValueType();
11370-
SDValue Shift =
11371-
DAG.getNode(ISD::SRA, DL, VT, LHS,
11372-
DAG.getConstant(VT.getSizeInBits() - 1, DL, VT));
11373-
return DAG.getNode(ISD::OR, DL, VT, Shift, DAG.getConstant(1, DL, VT));
11374-
}
1137511363

1137611364
// Check for SMAX(lhs, 0) and SMIN(lhs, 0) patterns.
1137711365
// (SELECT_CC setgt, lhs, 0, lhs, 0) -> (BIC lhs, (SRA lhs, typesize-1))

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5521,18 +5521,6 @@ SDValue ARMTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
55215521
ConstantSDNode *CTVal = dyn_cast<ConstantSDNode>(TrueVal);
55225522
ConstantSDNode *RHSC = dyn_cast<ConstantSDNode>(RHS);
55235523
if (Op.getValueType().isInteger()) {
5524-
// Check for sign pattern (SELECT_CC setgt, iN lhs, -1, 1, -1) and transform
5525-
// into (OR (ASR lhs, N-1), 1), which requires less instructions for the
5526-
// supported types.
5527-
if (CC == ISD::SETGT && RHSC && RHSC->isAllOnes() && CTVal && CFVal &&
5528-
CTVal->isOne() && CFVal->isAllOnes() &&
5529-
LHS.getValueType() == TrueVal.getValueType()) {
5530-
EVT VT = LHS.getValueType();
5531-
SDValue Shift =
5532-
DAG.getNode(ISD::SRA, dl, VT, LHS,
5533-
DAG.getConstant(VT.getSizeInBits() - 1, dl, VT));
5534-
return DAG.getNode(ISD::OR, dl, VT, Shift, DAG.getConstant(1, dl, VT));
5535-
}
55365524

55375525
// Check for SMAX(lhs, 0) and SMIN(lhs, 0) patterns.
55385526
// (SELECT_CC setgt, lhs, 0, lhs, 0) -> (BIC lhs, (SRA lhs, typesize-1))

llvm/test/CodeGen/ARM/cmp-select-sign.ll

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -75,31 +75,31 @@ define i4 @sign_i4(i4 %a) {
7575
define i8 @sign_i8(i8 %a) {
7676
; ARM-LABEL: sign_i8:
7777
; ARM: @ %bb.0:
78-
; ARM-NEXT: lsl r0, r0, #24
78+
; ARM-NEXT: sxtb r0, r0
7979
; ARM-NEXT: mov r1, #1
80-
; ARM-NEXT: orr r0, r1, r0, asr #31
80+
; ARM-NEXT: orr r0, r1, r0, asr #7
8181
; ARM-NEXT: bx lr
8282
;
8383
; THUMB-LABEL: sign_i8:
8484
; THUMB: @ %bb.0:
85-
; THUMB-NEXT: lsls r0, r0, #24
86-
; THUMB-NEXT: asrs r1, r0, #31
85+
; THUMB-NEXT: sxtb r0, r0
86+
; THUMB-NEXT: asrs r1, r0, #7
8787
; THUMB-NEXT: movs r0, #1
8888
; THUMB-NEXT: orrs r0, r1
8989
; THUMB-NEXT: bx lr
9090
;
9191
; THUMB2-LABEL: sign_i8:
9292
; THUMB2: @ %bb.0:
93-
; THUMB2-NEXT: lsls r0, r0, #24
93+
; THUMB2-NEXT: sxtb r0, r0
9494
; THUMB2-NEXT: movs r1, #1
95-
; THUMB2-NEXT: orr.w r0, r1, r0, asr #31
95+
; THUMB2-NEXT: orr.w r0, r1, r0, asr #7
9696
; THUMB2-NEXT: bx lr
9797
;
9898
; THUMBV8-LABEL: sign_i8:
9999
; THUMBV8: @ %bb.0:
100-
; THUMBV8-NEXT: lsls r0, r0, #24
100+
; THUMBV8-NEXT: sxtb r0, r0
101101
; THUMBV8-NEXT: movs r1, #1
102-
; THUMBV8-NEXT: orr.w r0, r1, r0, asr #31
102+
; THUMBV8-NEXT: orr.w r0, r1, r0, asr #7
103103
; THUMBV8-NEXT: bx lr
104104
%c = icmp sgt i8 %a, -1
105105
%res = select i1 %c, i8 1, i8 -1
@@ -109,31 +109,31 @@ define i8 @sign_i8(i8 %a) {
109109
define i16 @sign_i16(i16 %a) {
110110
; ARM-LABEL: sign_i16:
111111
; ARM: @ %bb.0:
112-
; ARM-NEXT: lsl r0, r0, #16
112+
; ARM-NEXT: sxth r0, r0
113113
; ARM-NEXT: mov r1, #1
114-
; ARM-NEXT: orr r0, r1, r0, asr #31
114+
; ARM-NEXT: orr r0, r1, r0, asr #15
115115
; ARM-NEXT: bx lr
116116
;
117117
; THUMB-LABEL: sign_i16:
118118
; THUMB: @ %bb.0:
119-
; THUMB-NEXT: lsls r0, r0, #16
120-
; THUMB-NEXT: asrs r1, r0, #31
119+
; THUMB-NEXT: sxth r0, r0
120+
; THUMB-NEXT: asrs r1, r0, #15
121121
; THUMB-NEXT: movs r0, #1
122122
; THUMB-NEXT: orrs r0, r1
123123
; THUMB-NEXT: bx lr
124124
;
125125
; THUMB2-LABEL: sign_i16:
126126
; THUMB2: @ %bb.0:
127-
; THUMB2-NEXT: lsls r0, r0, #16
127+
; THUMB2-NEXT: sxth r0, r0
128128
; THUMB2-NEXT: movs r1, #1
129-
; THUMB2-NEXT: orr.w r0, r1, r0, asr #31
129+
; THUMB2-NEXT: orr.w r0, r1, r0, asr #15
130130
; THUMB2-NEXT: bx lr
131131
;
132132
; THUMBV8-LABEL: sign_i16:
133133
; THUMBV8: @ %bb.0:
134-
; THUMBV8-NEXT: lsls r0, r0, #16
134+
; THUMBV8-NEXT: sxth r0, r0
135135
; THUMBV8-NEXT: movs r1, #1
136-
; THUMBV8-NEXT: orr.w r0, r1, r0, asr #31
136+
; THUMBV8-NEXT: orr.w r0, r1, r0, asr #15
137137
; THUMBV8-NEXT: bx lr
138138
%c = icmp sgt i16 %a, -1
139139
%res = select i1 %c, i16 1, i16 -1

0 commit comments

Comments
 (0)