Skip to content

Commit a380c0c

Browse files
committed
[ARM] Copy (SELECT_CC setgt, iN lhs, -1, 1, -1) -> (OR (ASR lhs, N-1), 1) pattern from ARM64 to ARM
It works perfectly on ARM too.
1 parent c7d5595 commit a380c0c

File tree

2 files changed

+90
-84
lines changed

2 files changed

+90
-84
lines changed

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5526,6 +5526,21 @@ SDValue ARMTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
55265526
SDValue FalseVal = Op.getOperand(3);
55275527
ConstantSDNode *CFVal = dyn_cast<ConstantSDNode>(FalseVal);
55285528
ConstantSDNode *CTVal = dyn_cast<ConstantSDNode>(TrueVal);
5529+
ConstantSDNode *RHSC = dyn_cast<ConstantSDNode>(RHS);
5530+
if (Op.getValueType().isInteger()) {
5531+
// Check for sign pattern (SELECT_CC setgt, iN lhs, -1, 1, -1) and transform
5532+
// into (OR (ASR lhs, N-1), 1), which requires less instructions for the
5533+
// supported types.
5534+
if (CC == ISD::SETGT && RHSC && RHSC->isAllOnes() && CTVal && CFVal &&
5535+
CTVal->isOne() && CFVal->isAllOnes() &&
5536+
LHS.getValueType() == TrueVal.getValueType()) {
5537+
EVT VT = LHS.getValueType();
5538+
SDValue Shift =
5539+
DAG.getNode(ISD::SRA, dl, VT, LHS,
5540+
DAG.getConstant(VT.getSizeInBits() - 1, dl, VT));
5541+
return DAG.getNode(ISD::OR, dl, VT, Shift, DAG.getConstant(1, dl, VT));
5542+
}
5543+
}
55295544

55305545
if (Subtarget->hasV8_1MMainlineOps() && CFVal && CTVal &&
55315546
LHS.getValueType() == MVT::i32 && RHS.getValueType() == MVT::i32) {

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

Lines changed: 75 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,37 @@
22
; RUN: llc -mtriple=armv7a < %s | FileCheck %s --check-prefix=ARM
33
; RUN: llc -mtriple=armv6m < %s | FileCheck %s --check-prefix=THUMB
44
; RUN: llc -mtriple=armv7m < %s | FileCheck %s --check-prefix=THUMB2
5+
; RUN: llc -mtriple=thumbv8.1m.main < %s | FileCheck %s --check-prefix=THUMBV8
56

67
define i3 @sign_i3(i3 %a) {
78
; ARM-LABEL: sign_i3:
89
; ARM: @ %bb.0:
9-
; ARM-NEXT: sbfx r1, r0, #0, #3
10-
; ARM-NEXT: mvn r0, #0
11-
; ARM-NEXT: cmn r1, #1
12-
; ARM-NEXT: movwgt r0, #1
10+
; ARM-NEXT: lsl r0, r0, #29
11+
; ARM-NEXT: mov r1, #1
12+
; ARM-NEXT: orr r0, r1, r0, asr #31
1313
; ARM-NEXT: bx lr
1414
;
1515
; THUMB-LABEL: sign_i3:
1616
; THUMB: @ %bb.0:
1717
; THUMB-NEXT: lsls r0, r0, #29
18-
; THUMB-NEXT: asrs r0, r0, #29
19-
; THUMB-NEXT: cmp r0, #0
20-
; THUMB-NEXT: bge .LBB0_2
21-
; THUMB-NEXT: @ %bb.1:
22-
; THUMB-NEXT: movs r0, #0
23-
; THUMB-NEXT: mvns r0, r0
24-
; THUMB-NEXT: bx lr
25-
; THUMB-NEXT: .LBB0_2:
18+
; THUMB-NEXT: asrs r1, r0, #31
2619
; THUMB-NEXT: movs r0, #1
20+
; THUMB-NEXT: orrs r0, r1
2721
; THUMB-NEXT: bx lr
2822
;
2923
; THUMB2-LABEL: sign_i3:
3024
; THUMB2: @ %bb.0:
31-
; THUMB2-NEXT: sbfx r1, r0, #0, #3
32-
; THUMB2-NEXT: mov.w r0, #-1
33-
; THUMB2-NEXT: cmp.w r1, #-1
34-
; THUMB2-NEXT: it gt
35-
; THUMB2-NEXT: movgt r0, #1
25+
; THUMB2-NEXT: lsls r0, r0, #29
26+
; THUMB2-NEXT: movs r1, #1
27+
; THUMB2-NEXT: orr.w r0, r1, r0, asr #31
3628
; THUMB2-NEXT: bx lr
29+
;
30+
; THUMBV8-LABEL: sign_i3:
31+
; THUMBV8: @ %bb.0:
32+
; THUMBV8-NEXT: lsls r0, r0, #29
33+
; THUMBV8-NEXT: movs r1, #1
34+
; THUMBV8-NEXT: orr.w r0, r1, r0, asr #31
35+
; THUMBV8-NEXT: bx lr
3736
%c = icmp sgt i3 %a, -1
3837
%res = select i1 %c, i3 1, i3 -1
3938
ret i3 %res
@@ -42,34 +41,32 @@ define i3 @sign_i3(i3 %a) {
4241
define i4 @sign_i4(i4 %a) {
4342
; ARM-LABEL: sign_i4:
4443
; ARM: @ %bb.0:
45-
; ARM-NEXT: sbfx r1, r0, #0, #4
46-
; ARM-NEXT: mvn r0, #0
47-
; ARM-NEXT: cmn r1, #1
48-
; ARM-NEXT: movwgt r0, #1
44+
; ARM-NEXT: lsl r0, r0, #28
45+
; ARM-NEXT: mov r1, #1
46+
; ARM-NEXT: orr r0, r1, r0, asr #31
4947
; ARM-NEXT: bx lr
5048
;
5149
; THUMB-LABEL: sign_i4:
5250
; THUMB: @ %bb.0:
5351
; THUMB-NEXT: lsls r0, r0, #28
54-
; THUMB-NEXT: asrs r0, r0, #28
55-
; THUMB-NEXT: cmp r0, #0
56-
; THUMB-NEXT: bge .LBB1_2
57-
; THUMB-NEXT: @ %bb.1:
58-
; THUMB-NEXT: movs r0, #0
59-
; THUMB-NEXT: mvns r0, r0
60-
; THUMB-NEXT: bx lr
61-
; THUMB-NEXT: .LBB1_2:
52+
; THUMB-NEXT: asrs r1, r0, #31
6253
; THUMB-NEXT: movs r0, #1
54+
; THUMB-NEXT: orrs r0, r1
6355
; THUMB-NEXT: bx lr
6456
;
6557
; THUMB2-LABEL: sign_i4:
6658
; THUMB2: @ %bb.0:
67-
; THUMB2-NEXT: sbfx r1, r0, #0, #4
68-
; THUMB2-NEXT: mov.w r0, #-1
69-
; THUMB2-NEXT: cmp.w r1, #-1
70-
; THUMB2-NEXT: it gt
71-
; THUMB2-NEXT: movgt r0, #1
59+
; THUMB2-NEXT: lsls r0, r0, #28
60+
; THUMB2-NEXT: movs r1, #1
61+
; THUMB2-NEXT: orr.w r0, r1, r0, asr #31
7262
; THUMB2-NEXT: bx lr
63+
;
64+
; THUMBV8-LABEL: sign_i4:
65+
; THUMBV8: @ %bb.0:
66+
; THUMBV8-NEXT: lsls r0, r0, #28
67+
; THUMBV8-NEXT: movs r1, #1
68+
; THUMBV8-NEXT: orr.w r0, r1, r0, asr #31
69+
; THUMBV8-NEXT: bx lr
7370
%c = icmp sgt i4 %a, -1
7471
%res = select i1 %c, i4 1, i4 -1
7572
ret i4 %res
@@ -78,33 +75,32 @@ define i4 @sign_i4(i4 %a) {
7875
define i8 @sign_i8(i8 %a) {
7976
; ARM-LABEL: sign_i8:
8077
; ARM: @ %bb.0:
81-
; ARM-NEXT: sxtb r1, r0
82-
; ARM-NEXT: mvn r0, #0
83-
; ARM-NEXT: cmn r1, #1
84-
; ARM-NEXT: movwgt r0, #1
78+
; ARM-NEXT: lsl r0, r0, #24
79+
; ARM-NEXT: mov r1, #1
80+
; ARM-NEXT: orr r0, r1, r0, asr #31
8581
; ARM-NEXT: bx lr
8682
;
8783
; THUMB-LABEL: sign_i8:
8884
; THUMB: @ %bb.0:
89-
; THUMB-NEXT: sxtb r0, r0
90-
; THUMB-NEXT: cmp r0, #0
91-
; THUMB-NEXT: bge .LBB2_2
92-
; THUMB-NEXT: @ %bb.1:
93-
; THUMB-NEXT: movs r0, #0
94-
; THUMB-NEXT: mvns r0, r0
95-
; THUMB-NEXT: bx lr
96-
; THUMB-NEXT: .LBB2_2:
85+
; THUMB-NEXT: lsls r0, r0, #24
86+
; THUMB-NEXT: asrs r1, r0, #31
9787
; THUMB-NEXT: movs r0, #1
88+
; THUMB-NEXT: orrs r0, r1
9889
; THUMB-NEXT: bx lr
9990
;
10091
; THUMB2-LABEL: sign_i8:
10192
; THUMB2: @ %bb.0:
102-
; THUMB2-NEXT: sxtb r1, r0
103-
; THUMB2-NEXT: mov.w r0, #-1
104-
; THUMB2-NEXT: cmp.w r1, #-1
105-
; THUMB2-NEXT: it gt
106-
; THUMB2-NEXT: movgt r0, #1
93+
; THUMB2-NEXT: lsls r0, r0, #24
94+
; THUMB2-NEXT: movs r1, #1
95+
; THUMB2-NEXT: orr.w r0, r1, r0, asr #31
10796
; THUMB2-NEXT: bx lr
97+
;
98+
; THUMBV8-LABEL: sign_i8:
99+
; THUMBV8: @ %bb.0:
100+
; THUMBV8-NEXT: lsls r0, r0, #24
101+
; THUMBV8-NEXT: movs r1, #1
102+
; THUMBV8-NEXT: orr.w r0, r1, r0, asr #31
103+
; THUMBV8-NEXT: bx lr
108104
%c = icmp sgt i8 %a, -1
109105
%res = select i1 %c, i8 1, i8 -1
110106
ret i8 %res
@@ -113,33 +109,32 @@ define i8 @sign_i8(i8 %a) {
113109
define i16 @sign_i16(i16 %a) {
114110
; ARM-LABEL: sign_i16:
115111
; ARM: @ %bb.0:
116-
; ARM-NEXT: sxth r1, r0
117-
; ARM-NEXT: mvn r0, #0
118-
; ARM-NEXT: cmn r1, #1
119-
; ARM-NEXT: movwgt r0, #1
112+
; ARM-NEXT: lsl r0, r0, #16
113+
; ARM-NEXT: mov r1, #1
114+
; ARM-NEXT: orr r0, r1, r0, asr #31
120115
; ARM-NEXT: bx lr
121116
;
122117
; THUMB-LABEL: sign_i16:
123118
; THUMB: @ %bb.0:
124-
; THUMB-NEXT: sxth r0, r0
125-
; THUMB-NEXT: cmp r0, #0
126-
; THUMB-NEXT: bge .LBB3_2
127-
; THUMB-NEXT: @ %bb.1:
128-
; THUMB-NEXT: movs r0, #0
129-
; THUMB-NEXT: mvns r0, r0
130-
; THUMB-NEXT: bx lr
131-
; THUMB-NEXT: .LBB3_2:
119+
; THUMB-NEXT: lsls r0, r0, #16
120+
; THUMB-NEXT: asrs r1, r0, #31
132121
; THUMB-NEXT: movs r0, #1
122+
; THUMB-NEXT: orrs r0, r1
133123
; THUMB-NEXT: bx lr
134124
;
135125
; THUMB2-LABEL: sign_i16:
136126
; THUMB2: @ %bb.0:
137-
; THUMB2-NEXT: sxth r1, r0
138-
; THUMB2-NEXT: mov.w r0, #-1
139-
; THUMB2-NEXT: cmp.w r1, #-1
140-
; THUMB2-NEXT: it gt
141-
; THUMB2-NEXT: movgt r0, #1
127+
; THUMB2-NEXT: lsls r0, r0, #16
128+
; THUMB2-NEXT: movs r1, #1
129+
; THUMB2-NEXT: orr.w r0, r1, r0, asr #31
142130
; THUMB2-NEXT: bx lr
131+
;
132+
; THUMBV8-LABEL: sign_i16:
133+
; THUMBV8: @ %bb.0:
134+
; THUMBV8-NEXT: lsls r0, r0, #16
135+
; THUMBV8-NEXT: movs r1, #1
136+
; THUMBV8-NEXT: orr.w r0, r1, r0, asr #31
137+
; THUMBV8-NEXT: bx lr
143138
%c = icmp sgt i16 %a, -1
144139
%res = select i1 %c, i16 1, i16 -1
145140
ret i16 %res
@@ -148,32 +143,28 @@ define i16 @sign_i16(i16 %a) {
148143
define i32 @sign_i32(i32 %a) {
149144
; ARM-LABEL: sign_i32:
150145
; ARM: @ %bb.0:
151-
; ARM-NEXT: mvn r1, #0
152-
; ARM-NEXT: cmn r0, #1
153-
; ARM-NEXT: movwgt r1, #1
154-
; ARM-NEXT: mov r0, r1
146+
; ARM-NEXT: mov r1, #1
147+
; ARM-NEXT: orr r0, r1, r0, asr #31
155148
; ARM-NEXT: bx lr
156149
;
157150
; THUMB-LABEL: sign_i32:
158151
; THUMB: @ %bb.0:
159-
; THUMB-NEXT: cmp r0, #0
160-
; THUMB-NEXT: bge .LBB4_2
161-
; THUMB-NEXT: @ %bb.1:
162-
; THUMB-NEXT: movs r0, #0
163-
; THUMB-NEXT: mvns r0, r0
164-
; THUMB-NEXT: bx lr
165-
; THUMB-NEXT: .LBB4_2:
152+
; THUMB-NEXT: asrs r1, r0, #31
166153
; THUMB-NEXT: movs r0, #1
154+
; THUMB-NEXT: orrs r0, r1
167155
; THUMB-NEXT: bx lr
168156
;
169157
; THUMB2-LABEL: sign_i32:
170158
; THUMB2: @ %bb.0:
171-
; THUMB2-NEXT: mov.w r1, #-1
172-
; THUMB2-NEXT: cmp.w r0, #-1
173-
; THUMB2-NEXT: it gt
174-
; THUMB2-NEXT: movgt r1, #1
175-
; THUMB2-NEXT: mov r0, r1
159+
; THUMB2-NEXT: movs r1, #1
160+
; THUMB2-NEXT: orr.w r0, r1, r0, asr #31
176161
; THUMB2-NEXT: bx lr
162+
;
163+
; THUMBV8-LABEL: sign_i32:
164+
; THUMBV8: @ %bb.0:
165+
; THUMBV8-NEXT: movs r1, #1
166+
; THUMBV8-NEXT: orr.w r0, r1, r0, asr #31
167+
; THUMBV8-NEXT: bx lr
177168
%c = icmp sgt i32 %a, -1
178169
%res = select i1 %c, i32 1, i32 -1
179170
ret i32 %res

0 commit comments

Comments
 (0)